NCO: Extract a variable from NetCDF file using NCO ncks

10,211

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
Share:
10,211
F. Brazil
Author by

F. Brazil

Updated on June 16, 2022

Comments

  • F. Brazil
    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
    F. Brazil over 6 years
    Hello Charlie. Thank you very much for answering my question and helping me out with this issue. Appreciated.