NCO: Extract a variable from NetCDF file using NCO ncks
Solution 1
This behavior occurs because, by default, NCO extracts all the variables "associated" with a requested variable. That way users get everything they need without having to look for it themselves. In other words, it's a feature, not a bug. To extract only the variables explicitly requested, use the -C switch, documented here, e.g.
ncks -C -v ta temp1.nc out.nc
The docs also show how to strip away the CF-conventions-associated variables, while retainining, say, the coordinates, with a variety of longer options.
Solution 2
Just to give another command line alterative to NCO, you can also use CDO,
the command is:
cdo selvar,variable_name input.nc output.nc
if you don't have it, you can install it with ubuntu, mint etc with
sudo apt-get install cdo
F. Brazil
Updated on June 16, 2022Comments
-
F. Brazil about 2 years
I am trying to extract a variable from a multi-variable netcdf file, by entering the command:
ncks -v ta temp1.nc out.nc
However then I look at the out.nc header, all the variables are still there.
The headers of both temp1.nc and out.nc are below:
--- temp1.nc header --- dimensions: time = UNLIMITED ; // (124 currently) lon = 256 ; bnds = 2 ; lat = 128 ; lev = 40 ; variables: double time(time) ; time:standard_name = "time" ; time:long_name = "time" ; time:units = "days since 1850-1-1" ; time:calendar = "365_day" ; time:axis = "T" ; double lon(lon) ; lon:standard_name = "longitude" ; lon:long_name = "longitude" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:bounds = "lon_bnds" ; double lon_bnds(lon, bnds) ; double lat(lat) ; lat:standard_name = "latitude" ; lat:long_name = "latitude" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:bounds = "lat_bnds" ; double lat_bnds(lat, bnds) ; double p0 ; p0:long_name = "reference pressure" ; p0:units = "Pa" ; double lev(lev) ; lev:standard_name = "atmosphere_hybrid_sigma_pressure_coordinat lev:axis = "Z" ; lev:positive = "down" ; lev:long_name = "hybrid sigma pressure coordinate" ; lev:units = "1" ; lev:formula_terms = "a: a b: b p0: p0 ps: ps" ; lev:bounds = "lev_bnds" ; lev:formula = "p = a*p0 + b*ps" ; double lev_bnds(lev, bnds) ; lev_bnds:standard_name = "atmosphere_hybrid_sigma_pressure_coor lev_bnds:units = "1" ; lev_bnds:formula_terms = "a: a_bnds b: b_bnds p0: p0 ps: ps" ; double a(lev) ; a:long_name = "vertical coordinate formula term: ap(k)" ; a:units = "Pa" ; double b(lev) ; b:long_name = "vertical coordinate formula term: b(k)" ; b:units = "1" ; double a_bnds(lev, bnds) ; a_bnds:long_name = "vertical coordinate formula term: ap(k+1/2) a_bnds:units = "Pa" ; double b_bnds(lev, bnds) ; b_bnds:long_name = "vertical coordinate formula term: b(k+1/2)" b_bnds:units = "1" ; float ps(time, lat, lon) ; ps:standard_name = "surface_air_pressure" ; ps:long_name = "Surface Air Pressure" ; ps:units = "Pa" ; ps:comment = "surface pressure, not mean sea level pressure" ; ps:original_units = "hPa" ; ps:history = "2011-10-17T12:45:37Z altered by CMOR"; ps:cell_measures = "area: areacella" ; float ta(time, lev, lat, lon) ; ta:standard_name = "air_temperature" ; ta:long_name = "Air Temperature" ; ta:units = "K" ; ta:_FillValue = 1.e+20f ; ta:missing_value = 1.e+20f ; ta:original_name = "T" ; ta:cell_measures = "area: areacella" ; ta:history = "2011-10-17T12:45:37Z altered by CMOR ; // global attributes:
--- out.nc header ---
dimensions: lev = 40 ; bnds = 2 ; lat = 128 ; lon = 256 ; time = UNLIMITED ; // (124 currently) variables: double a(lev) ; a:long_name = "vertical coordinate formula term: ap(k)" ; a:units = "Pa" ; double a_bnds(lev, bnds) ; a_bnds:long_name = "vertical coordinate formula term: ap(k+1/2)" ; a_bnds:units = "Pa" ; double b(lev) ; b:long_name = "vertical coordinate formula term: b(k)" ; b:units = "1" ; double b_bnds(lev, bnds) ; b_bnds:long_name = "vertical coordinate formula term: b(k+1/2)" ; b_bnds:units = "1" ; double lat(lat) ; lat:standard_name = "latitude" ; lat:long_name = "latitude" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:bounds = "lat_bnds" ; double lat_bnds(lat, bnds) ; double lev(lev) ; lev:standard_name = "atmosphere_hybrid_sigma_pressure_coordinate" ; lev:axis = "Z" ; lev:positive = "down" ; lev:long_name = "hybrid sigma pressure coordinate" ; lev:units = "1" ; lev:formula_terms = "a: a b: b p0: p0 ps: ps" ; lev:bounds = "lev_bnds" ; lev:formula = "p = a*p0 + b*ps" ; double lev_bnds(lev, bnds) ; lev_bnds:standard_name = "atmosphere_hybrid_sigma_pressure_coordinate" ; lev_bnds:units = "1" ; lev_bnds:formula_terms = "a: a_bnds b: b_bnds p0: p0 ps: ps" ; double lon(lon) ; lon:standard_name = "longitude" ; lon:long_name = "longitude" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:bounds = "lon_bnds" ; double lon_bnds(lon, bnds) ; double p0 ; p0:long_name = "reference pressure" ; p0:units = "Pa" ; float ps(time, lat, lon) ; ps:standard_name = "surface_air_pressure" ; ps:long_name = "Surface Air Pressure" ; ps:units = "Pa" ; ps:comment = "surface pressure, not mean sea level pressure" ; ps:original_units = "hPa" ; ps:history = "2011-10-17T12:45:37Z altered by CMOR" ; ps:cell_measures = "area: areacella" ; float ta(time, lev, lat, lon) ; ta:standard_name = "air_temperature" ; ta:long_name = "Air Temperature" ; ta:units = "K" ; ta:_FillValue = 1.e+20f ; ta:missing_value = 1.e+20f ; ta:original_name = "T" ; ta:cell_measures = "area: areacella" ; ta:history = "2011-10-17T12:45:37Z altered by CMOR" ; double time(time) ; time:standard_name = "time" ; time:long_name = "time" ; time:units = "days since 1850-1-1" ; time:calendar = "365_day" ; time:axis = "T" ; // global attributes:
I expected to have only ta on out.nc. I don't get any error message from ncks.
What am I doing wrong here? I appreciate any help.
Thank you.
-
F. Brazil over 6 yearsHello Charlie. Thank you very much for answering my question and helping me out with this issue. Appreciated.