NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.

To learn about what's going on, see About the Archive Site.

Re: [netcdfgroup] Modifying NEtcdf file [SEC=UNCLASSIFIED]

Hi,

As someone else suggested, the NetCDF operators are very useful. Another useful 
way of modifying files is like this:

ncdump file.nc | awkscript.awk | ncgen -o newfile.nc

Where awkscript.awk manipulates the file in the way you want. To illustrate the 
point, I am attaching a little script I have been writing to make non-CF 
compliant files CF compliant. Maybe this will give you some ideas about how you 
can solve your problem?

Cheers,

Tim Hume
Centre for Australian Weather and Climate Research
Melbourne
Australia 


---- Example script illustrating use of ncdump, awk and ncgen ----

ncdump "${ncfile}" | awk -F= -v var_name="${var_name}" \
        'BEGIN{
                nlons  = 0;
                nlats  = 0;
                nprogs = 0;
        }
        /^dimensions:/{
                print $0;
                printf("\tbounds = 2 ;\n");
                prev_line = "dimensions";
                next;
        }
        /^\/\/ global attributes:/{
                if ((var_name == "accum_precip")||(var_name == 
"temperature_2m")||(var_name == "dewpoint_2m")){
                        printf("\tdouble level ;\n");
                        printf("\t\tlevel:long_name = \"Height above the 
surface\" ;\n");
                        printf("\t\tlevel:units = \"m\" ;\n");
                }
                print $0;
                next;
        }
        /^data:/{
                print $0;
                if (var_name == "accum_precip"){
                        printf("\n level = 0. ;\n");
                } else if ((var_name == "temperature_2m")||(var_name == 
"dewpoint_2m")){
                        printf("\n level = 2. ;\n");
                }
                next;
        }
        /^[[:space:]]*longitude:/{
                print $0;
                prev_line = "longitude_var";
                next;
        }
        /^[[:space:]]*latitude:/{
                print $0;
                prev_line = "latitude_var";
                next;
        }
        /^[[:space:]]*forecast:/{
                print $0;
                prev_line = "forecast_var";
                next;
        }
        /^ longitude[[:space:]]+=/,/;$/{
                print $0;
                n = split($NF,lons,/[,;]/);
                for (ii=1; ii<n; ++ii){
                        lon_vals[ii+nlons] = lons[ii];
                }
                nlons += (n-1);
                prev_line = "longitude_data";
                next;
        }
        /^ latitude[[:space:]]+=/,/;$/{
                print $0;
                n = split($NF,lats,/[,;]/);
                for (ii=1; ii<n; ++ii){
                        lat_vals[ii+nlats] = lats[ii];
                }
                nlats += (n-1);
                prev_line = "latitude_data";
                next;
        }
        /^ forecast[[:space:]]+=/,/;$/{
                print $0;
                n = split($NF,progs,/[,;]/);
                for (ii=1; ii<n; ++ii){
                        prog_vals[ii+nprogs] = progs[ii];
                }
                nprogs += (n-1);
                prev_line = "forecast_data";
                next;
        }
        {
                if (prev_line == "longitude_var"){
                        printf("\tdouble longitude_bounds(longitude, bounds) 
;\n");
                        printf("\t\tlongitude_bounds:long_name = \"grid cell 
longitude boundaries\" ;\n");
                        printf("\t\tlongitude_bounds:units = \"degrees_east\" 
;\n");
                        printf("\t\tlongitude_bounds:valid_min = -360.d ;\n");
                        printf("\t\tlongitude_bounds:valid_max = 360.d ;\n");
                }

                if (prev_line == "latitude_var"){
                        printf("\tdouble latitude_bounds(latitude, bounds) 
;\n");
                        printf("\t\tlatitude_bounds:long_name = \"grid cell 
latitude boundaries\" ;\n");
                        printf("\t\tlatitude_bounds:units = \"degrees_north\" 
;\n");
                        printf("\t\tlatitude_bounds:valid_min = -90.d ;\n");
                        printf("\t\tlatitude_bounds:valid_max = 90.d ;\n");
                }

                if (prev_line == "forecast_var"){
                        printf("\tdouble forecast_bounds(forecast, bounds) 
;\n");
                        printf("\t\tforecast_bounds:long_name = \"forecast 
interval\" ;\n");
                        printf("\t\tforecast_bounds:units = \"hours\" ;\n");
                }

                if (prev_line == "longitude_data"){
                        printf("\n");
                        printf(" longitude_bounds = ");
                        lon1 = lon_vals[1] - (lon_vals[2] - lon_vals[1])/2;
                        lon2 = lon_vals[1] + (lon_vals[2] - lon_vals[1])/2;
                        printf("%f, %f, ",lon1, lon2);
                        for (ii=2; ii<nlons; ++ii){
                                lon1 = lon_vals[ii] - (lon_vals[ii] - 
lon_vals[ii-1])/2;
                                lon2 = lon_vals[ii] + (lon_vals[ii+1] - 
lon_vals[ii])/2;
                                printf("%f, %f, ",lon1, lon2);
                        }
                        lon1 = lon_vals[nlons] - (lon_vals[nlons] - 
lon_vals[nlons-1])/2;
                        lon2 = lon_vals[nlons] + (lon_vals[nlons] - 
lon_vals[nlons-1])/2;
                        printf("%f, %f ;\n",lon1, lon2);
                }

                if (prev_line == "latitude_data"){
                        printf("\n");
                        printf(" latitude_bounds = ");
                        lat1 = lat_vals[1] - (lat_vals[2] - lat_vals[1])/2;
                        lat2 = lat_vals[1] + (lat_vals[2] - lat_vals[1])/2;
                        lat1 = (lat1 < -90) ? -90 : lat1;
                        lat1 = (lat1 > 90)  ? 90 : lat1;
                        lat2 = (lat2 < -90) ? -90 : lat2;
                        lat2 = (lat2 > 90)  ? 90 : lat2;
                        printf("%f, %f, ",lat1, lat2);
                        for (ii=2; ii<nlats; ++ii){
                                lat1 = lat_vals[ii] - (lat_vals[ii] - 
lat_vals[ii-1])/2;
                                lat2 = lat_vals[ii] + (lat_vals[ii+1] - 
lat_vals[ii])/2;
                                lat1 = (lat1 < -90) ? -90 : lat1;
                                lat1 = (lat1 > 90)  ? 90 : lat1;
                                lat2 = (lat2 < -90) ? -90 : lat2;
                                lat2 = (lat2 > 90)  ? 90 : lat2;
                                printf("%f, %f, ",lat1, lat2);
                        }
                        lat1 = lat_vals[nlats] - (lat_vals[nlats] - 
lat_vals[nlats-1])/2;
                        lat2 = lat_vals[nlats] + (lat_vals[nlats] - 
lat_vals[nlats-1])/2;
                        lat1 = (lat1 < -90) ? -90 : lat1;
                        lat1 = (lat1 > 90)  ? 90 : lat1;
                        lat2 = (lat2 < -90) ? -90 : lat2;
                        lat2 = (lat2 > 90)  ? 90 : lat2;
                        printf("%f, %f ;\n",lat1, lat2);
                }
                if (prev_line == "forecast_data"){
                        printf("\n");
                        printf(" forecast_bounds = ");
                        for (ii=1; ii<nprogs; ++ii){
                                if (var_name == "accum_precip"){
                                        prog1 = 0;
                                        prog2 = prog_vals[ii];
                                } else {
                                        prog1 = prog_vals[ii];
                                        prog2 = prog_vals[ii];
                                }
                                printf("%f, %f, ",prog1, prog2);
                        }
                        if (var_name == "accum_precip"){
                                prog1 = 0;
                                prog2 = prog_vals[nprogs];
                        } else {
                                prog1 = prog_vals[nprogs];
                                prog2 = prog_vals[nprogs];
                        }
                        printf("%f, %f ;\n",prog1, prog2);
                }

                print $0;
                prev_line = "other";
        }' | fmt -s -w 132 | ncgen -o "${ncfile}.new"

#
# Add some extra attributes etc.
#

ncatted -O -h -a bounds,latitude,o,c,"latitude_bounds" \
        -a valid_min,latitude,o,d,-90. \
        -a valid_max,latitude,o,d,90. \
        -a bounds,longitude,o,c,"longitude_bounds" \
        -a valid_min,longitude,o,d,-360. \
        -a valid_max,longitude,o,d,360. \
        -a bounds,forecast,o,c,"forecast_bounds" \
        -a calendar,basetime,o,c,"gregorian" \
        -a Conventions,global,o,c,"CF-1.3" \
        -a history,global,o,c,"File created by the Gridded OCF data ingest 
system" \
        -a History,global,d,, \
        -a institution,global,o,c,"Australian Bureau of Meteorology" \
        -a source,global,o,c,"model" \
        -a standard_name,${var_name},o,c,"${std_name}" \
        -a title,global,o,c,"${model_str} forecasts of ${var_name}; resolution: 
${res_str}; source:${source}" \
        -a nco_input_file_number,global,d,, \
        -a nco_input_file_list,global,d,, \
        "${ncfile}.new"

-----Original Message-----
From: netcdfgroup-bounces@xxxxxxxxxxxxxxxx 
[mailto:netcdfgroup-bounces@xxxxxxxxxxxxxxxx] On Behalf Of Blanquita Oviedo
Sent: Wednesday, 26 November 2008 02:56
To: netcdfgroup@xxxxxxxxxxxxxxxx
Subject: [netcdfgroup] Modifying NEtcdf file


Hi,
 
        I am new using netCDF and I don't know anybody in my country, Colombia, 
that is currently working with netCDF files.

In order to make the investigation for my master, I need to modify an a 
extensive netCDF file (105.000K). I need to modify aprox 120.000 lines of data, 
but I don´t know any method to do it.
 
I try to convert the source netCDF file into text (using ncdump - o),  then I 
modified it and now I have an ASCII file separated by commas and with 
characters in return in each line, as obtained using the command ncdump of the 
original file.
 
For example:
 
temp =
// temp(0,0,0, 0-54)
277.4813, 276.4155, 275.3335, 274.2372, 273.4386, 273.0315, 272.6246, 
272.2128, 271.7205, 271.1262, 270.5313, 269.9269, 269.3189, 268.7285, 
268.1587, 267.6162, 267.5617, 268.1147, 268.6765, 269.2408, 269.4946, 
269.3569, 269.1975, 269.0216, 268.8656, 268.7551, 268.6632, 268.5788, 
269.1266, 270.4707, 271.8028, 273.1227, 273.7098, 273.3803, 273.0515, 
272.7239, 272.7801, 273.3181, 273.8549, 274.3895, 274.682, 274.6729, 
274.6642, 274.6566, 274.9037, 275.468, 276.0289, 276.5884, 276.3576, 
275.124, 273.8793, 272.6223, 271.6534, 271.0549, 270.4564,
// temp(0,0,1, 0-54)
276.8679, 275.8403, 274.7976, 273.7424, 273.0192, 272.7307, 272.4441, 
272.1526, 271.7513, 271.2129, 270.6729, 270.1262, 269.5375, 268.9077, 
268.2888, 267.6906, 267.6292, 268.238, 268.859, 269.4889, 269.8028, 
269.7146, 269.6006, 269.4674, 269.2771, 269.037, 268.8181, 268.608, 
269.0854, 270.4286, 271.7578, 273.0732, 273.6958, 273.4539, 273.2136, 
272.9739, 272.9522, 273.2037, 273.4539, 273.7034, 273.8842, 273.9784, 
274.0724, 274.1676, 274.4979, 275.1201, 275.7378, 276.3535, 276.2311, 
275.1737, 274.1059, 273.0276, 272.2213, 271.7681, 271.3176,
 
I have problems to return it to turn to netCDF format because the command ncgen 
does not work to me. I would like to ask you your support in order to advance 
and to obtain a netCDF modified file.  
 
Thanks for the support that you can provide to me.

Blanca Elvira Oviedo T. 

        _______________________________________________
        netcdfgroup mailing list
        netcdfgroup@xxxxxxxxxxxxxxxx
        For list information or to unsubscribe,  visit:
        http://www.unidata.ucar.edu/mailing_lists/ 




  • 2008 messages navigation, sorted by:
    1. Thread
    2. Subject
    3. Author
    4. Date
    5. ↑ Table Of Contents
  • Search the netcdfgroup archives: