GRIB API学习笔记06——grib_filter
1.1. 介绍
高级命令行工具
迭代输入的所有消息,对每个消息应用一组用户定义的规则。
规则由GRIB API提供的微型语言构成,这种微语言不具有完整编程语言的能力。
通过key访问消息中的数据
打印消息的内容
设置消息中的数据值
使用控制结构
将消息写入硬盘
1.2. 用法
[shell]grib_filter rules_file [-o out_file] _in_file1 in_file2…[/shell]
每个输入文件都按照rules_file中的规则进行处理。
只有在使用write语句时才将grib消息写入输出文件。
rules_file中的每个语句以分号“;”结尾。
rules_file中的语法错误按行号报错。例
1.3. 规则语法
1.3.1. print
print “输出的文本”; # 注释
print “some text [key]”;
打印到标准输出
输出方括号中的key的值
如果没有在消息中找到[key]的值,则显示”undef”
[key] -> 原始类型
[key:l] -> integer (the “el” is for “long”!)
[key:s] -> string
[key:d] -> double
[key!c%F’S’] -> arrays: c->columns F->format (C style) S->separator ****
print (“filename”) “some text [key]”;
例1:
以下例子中,我使用uv500.grib2作为示例grib文件。文件内容如下
命令:
例2
命令:
例3:
1.3.2. write
write;
将当前消息写入命令行中-o参数指定的输出文件( grib_filter –o outfile rules_file grib_file).
如果-o参数没设置,则默认输出到“filter.out” 文件。
write “filename__[key]”;
将当前消息写入到文件“filename[key]”中,其中方括号中的key用消息中该key的值代替。
需要注意的副作用:如果两个消息的键值不一样,将被写入不同的文件。
例4:
1.3.3. append
append;
将当前消息附加到输出文件(由-o定义),默认文件为filter.out。
append “filename_[key]”;
将当前消息附加到输出文件“filename[key]_”,其中[key]由相应key的值替换.
如果文件不存在,则创建。
如果两个消息key的值不一样,将附加到不同的文件中。
例5:
append;
命令:
1.3.4. set
**set key1 = key2; ** # 将key1设置为key2的值 ****
**set key = {val1,val2,val3,val4}; ** # 设置数组 ****
**set key = “string”; ** # 设置字符串 ****
set key = expression ; ** # 设置key为表达式的值
set key = MISSING ; ** # 设置为****missing
表达式运算符:
== equal to
is equal to for strings
!= not equal to
|| or
&& and
! Not
Arithmetic operators * / + –
()
例6:
例7:
1.3.5. transient
transient key1 = key2;
定义一个新的key1,并将key2的值赋给它
transient key1 = “string”;
transient key1 = expression ;
expression operators :
== equal to
is equal to for strings
!= not equal to
|| or
&& and
! not
Arithmetic operators * / + –
()
例8:
1.3.6. if语句
if ( expression ) { instructions }
if ( expression ) { instructions } else { instructions } ****
expression operators :
n == equal to
n is equal to for strings
n != not equal to
n || or
n && and
n ! not
n Arithmetic operators * / + –
n ()
例9:该例子没有实际实验
使用如下
print “processing [shortName]”;
if(shortName == “u”){
print “shortName”;
}
会提示:
$ grib_filter rules.filter uv500.grib2
processing u
ERROR: Invalid key type
不知道原因,是否if中无法比较字符串?因为改成数字就正确
1.3.7. switch语句
Switch statement
if-else语句的替换版本
在需要从多个选项中选择时十分方便
语法:
例10:
例11:
1.4. 练习
略