...
Does not fail when the message has wrong length
...
Verbose.
bufr_filter examples
...
The bufr_filter processes sequentially all bufr messages contained in the input files and applies the rules to each one of them. Input messages can be written to the output by using the "write" statement. The write statement can be parameterised so that output is sent to multiple files depending on key values used in the output file name. If we write a rules_file containing the only statement:
Code Block |
---|
write "../data/split/[bufrHeaderCentre:l]_[dataCategory].bufr[editionNumber]";
|
Code Block |
---|
> bufr_filter rules_file ../data/bufr/multitype.bufr
> ls ../data/split
98_0.bufr3
98_3.bufr4
98_5.bufr3
multitype.bufr
|
...
The bufr header information can be accessed without unpacking the data. This rules_file:
Code Block |
---|
print "[bufrHeaderCentre] [bufrHeaderSubCentre] [masterTablesVersionNumber] [localTablesVersionNumber] [numberOfSubsets]";
|
Code Block |
---|
> bufr_filter rules_file ../data/bufr/syno_multi.bufr
98 0 13 1 1
98 0 13 1 1
98 0 13 1 1
|
...
To print values from the data section the messages have to be unpacked. To do that we need to set key unapack to 1. This rules_file:
Code Block |
---|
set unpack=1;
print "block=[blockNumber] station=[stationNumber] lat=[latitude] lon=[longitude] t2=[airTemperatureAt2M]";
|
Code Block |
---|
> bufr_filter rules_file ../data/bufr/syno_multi.bufr
block=1 station=1 lat=70.93 lon=-8.67 t2=274.5
block=1 station=3 lat=77 lon=15.5 t2=268.4
block=1 station=7 lat=78.92 lon=11.93 t2=268.5
|
...
bufr_filter allows defining new keys with the transient keyword. We will further develop the previous example by creating a new key to combine the block number and the station number into the full WMO station id:
Code Block |
---|
set unpack=1;
transient statid=1000*blockNumber+stationNumber;
print "statid=[statid] lat=[latitude] lon=[longitude] t2=[airTemperatureAt2M]";
|
Code Block |
---|
> bufr_filter rules_file ../data/bufr/syno_multi.bufr
statid=1001 lat=70.93 lon=-8.67 t2=274.5
statid=1003 lat=77 lon=15.5 t2=268.4
statid=1007 lat=78.92 lon=11.93 t2=268.5
|
...
We can use conditional statements in bufr_filter. The syntax is:
Code Block |
---|
if ( condition ) { block of rules } else { block of rules }
|
Code Block |
---|
set unpack=1;
transient statid=1000*blockNumber+stationNumber;
if (dataCategory ==0 && statid == 1003) {
write out.bufr;
}
|
...
The switch statement is an enhanced version of the if statement. Its syntax is the following:
Code Block |
---|
switch (key1,key2,...,keyn) {
case val11,val12,...,val1n:
# block of rules;
case val21,val22,...,val2n:
# block of rules;
default:
# [ block of rules ]
}
|
...
To access the keys' attributes use the -> operator. The example below prints the attributes of key pressure from a SYNOP bufr message.
Code Block |
---|
print "pressure=[pressure] [pressure->units]";
print "pressure->code=[pressure->code!06d]";
print "pressure->scale=[pressure->scale]";
print "pressure->reference=[pressure->reference]";
print "pressure->width=[pressure->width]";
print "pressure->percentConfidence=[pressure->percentConfidence] [pressure->percentConfidence->units]";
print "pressure->percentConfidence->code=[pressure->percentConfidence->code!06d]";
print "pressure->percentConfidence->scale=[pressure->percentConfidence->scale]";
print "pressure->percentConfidence->reference=[pressure->percentConfidence->reference]";
print "pressure->percentConfidence->width=[pressure->percentConfidence->width]";
|
Code Block |
---|
> bufr_filter rules_file ../data/bufr/syno_1.bufr
pressure=100910 Pa
pressure->code=010004
pressure->scale=-1
pressure->reference=0
pressure->width=14
pressure->percentConfidence=74 %
pressure->percentConfidence->code=033007
pressure->percentConfidence->scale=0
pressure->percentConfidence->reference=0
pressure->percentConfidence->width=7
|
...
To access keys by rank (i.e. by their occurrence in the message) use the # operator. The example below prints the value from the 4th occurrence of key pressure from a TEMP bufr message. As a reference, we also print all the pressure values found in the message.
Code Block |
---|
set unpack=1;
print "pressure=[pressure#4] [pressure#4->units]";
print "pressure=[pressure]";
|
Code Block |
---|
> bufr_filter rules_file ../data/bufr/temp_101.bufr
pressure=98500 Pa
pressure=102000 101800 100000 98500 96400 92500 92100 89700
88100 86100 85000 84400 79400 79000 78300 77300
71900 70000 69400 65100 61200 53400 50000 43900
40000 39900 37800 31600 30000 27500 25000 21200
21000 20600 20400 20000 19300 18400 17000 16600
15100 15000 14600 14000 13400 13200 12900 11100
10800 10000 8960 7630 7000 6420 6190 5770
5320 5000 3970 3570 3190 3090 3000 2820
2630 2400 2340 2050 2000 1680 1530 1500
1380 1300 1210 31600
|
...
It is possible to access elements by conditions imposed on coordinate descriptors. The example below prints the temperature values on temperature significant levels from a TEMP bufr message. For temperature significant levels the key verticalSoundingSignificance=4 and this is what we use in the condition:
Code Block |
---|
set unpack=1;
print "[/verticalSoundingSignificance=4/airTemperature]";
|
Code Block |
---|
> bufr_filter rules_file ../data/bufr/temp_101.bufr
272.1 269.5 268.1 267.9 266.7 266.1 264.9 264.9
260.5 260.9 263.5 263.7 261.7 261.9 259.1 258.9
251.5 243.9 238.3 236.7 221.7 212.7 215.5 215.9
214.1 217.3 218.3 217.3 219.3 218.9 219.5 217.9
218.3 217.5 220.3 219.1 220.1 217.3 216.5 217.7
215.9 217.1 213.5 216.1 214.7 216.1 215.3 216.5
213.9 215.3 215.7 212.7 214.1 216.1 213.7 215.3
214.9
|
...
Another example for accessing keys by condition is to read scatterometer data. File asca_139.bufr contains a single message with 2016 subsets in a compressed form. In this case each subset has exactly the same structure: they store one location with several beams and one backscatter value in each beam. To print the backScatter values for beamIdentifier=2 from all the subsets we can simply define the condition like this:
Code Block |
---|
set unpack=1;
print "/beamIdentifier=2/backscatter=[/beamIdentifier=2/backscatter]";
|
Code Block |
---|
> bufr_filter rules_file ../data/bufr/asca_139.bufr
/beamIdentifier=2/backscatter=-24.6 -24.78 -24.92 -25.05 -25.04 -24.72 -23.83 -22.57
-21.71 -21.76 -21.81 -20.97 -19.97 -19.01 -17.8 -16.22
-14.67 -13.26 -12.02 -11.01 -9.84 -7.31 -8.76 -10.13
-11.36 -12.58 -13.49 -13.87 -13.77 -13.44 -13.42 -13.58
-13.92 -14.6 -15.36 -16.22 -17.11 -17.98 -18.56 -18.58
-18.49 -18.45 -22.66 -22.99 -23.37 -23.85 -24.27 -24.57
-24.54 -24.17 -23.96 -24.47 -24.53 -23.11 -21.62 -20.27
-18.93 -17.42 -15.78 -14.13 -12.6 -11.35 -10.06 -7.38
-8.57 -9.82 -11.43 -12.88 -13.83 -14.25 -14.21 -14.16
-14.32 -14.44 -14.73 -15.21 -15.94 -17 -17.87 -18.64
and many more values ......
|