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.  练习