参考自ECMWF网站https://confluence.ecmwf.int/display/OPTR/ecCodes%3A+GRIB+and+BUFR+data+decoding+and+encoding+software+2019的ppt

引言

  • eccodes高端命令行工具
  • 在输入文件中遍历所有messages
  • 对于每个message采用一个用户定义的规则
  • 该规则使用ecCodes规定的宏语言的格式
  • 注意该宏语言并没有一个全面的(full-blown)编程的能力
  • 在grib_filter和bufr_filter中的宏语言的语法是相同的
  • 在一个message中通过关键字keys访问数据
  • 打印一个message的内容
  • 在一个message中保存值
  • 使用控制结构(if,switch)
  • 将消息写入磁盘

grib_filter 用法

grib_filter [-o out_file ] rules_file in_file1 in_file2 …
  • 输入文件中每一个场都被处理,在规则文件rules_file中的规则被应用在其中
  • 仅当有一个写的指令被应用时,一个GRIB message被写在一个输出文件中
  • 在rules_file中每一个指令必须以一个分号“;”结尾
  • rules_file中的语法错误会报告,连同错误的行号
  • 永远都要将-o out_file 放在其它选项之前!
  • 或者,可以从标准输入中读取规则:

cat rules_file | grib_filter in_file1 in_file2 …

echo ‘print “Hello”;’ | grib_filter in_file1 in_file2 …

规则语法-print声明

  • print “some text”; # this is a comment
  • print “some text [key]";

-打印到标准输出 Print to the standard output

-检索方括号中的关键字的值 Retrieve the value of the keys in squared brackets.

-如果在消息中没有找到关键字的值,将会被赋值为"undef" If a key is not found in the message then the value of [key] will be displayed as "undef"

-[key] --> native type

-[key:i ] --> integer

-[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——使用print (注:分割线上面的是rule.filter的内容,下面是命令及输出)

# A simple print
print "ed = [edition] centre is [centre:s] = [centre:i]";
----------------------------------------------------------------------------------------------
> grib_filter rule.filter x.grib1
ed = 1 centre is ecmf = 98

例子2——使用有格式的print

# one column 3 decimal digits
print "[distinctLatitudes!1%.3f]";
----------------------------------------------------------------------------------------------
-90.000
-88.500
-87.000
-85.500

例子3——用分隔符输出

# three columns 5 decimal digits comma separated
print "[latLonValues!3%.5f',']";
------------------------------------------------------------------------
> grib_filter rule.filter x.grib1
90.00000,0.00000,1.00000,
90.00000,1.50000,1.00000,
90.00000,3.00000,1.00000,

规则语法——write声明

  • write;

- 在命令行中用-o选项定义输出文件,将现有消息写到该输出文件中

grib_filter -o outfile rules_file grib_file

如果-o选项没有指定,使用缺省值”filter.out“

  • write "filename_[key]";

-将当前message写入文件"filename_[key]"中,其中方括号内的key用message中检索到的值代替

-如果两个message对于[key]有不同的值,它们同样写到不同文件中

例子4——write 声明

# Creating multiple files
write "[centre]_[dataDate]_[step].grib[edition]";
-------------------------------------------------------------
> grib_filter rule.filter x.grib1
> ls
ecmf_20080213_0.grib1
ecmf_20080213_6.grib1
ecmf_20080213_12.grib1
ecmf_20080213_24.grib1

规则语法——append声明

  • append;

- 在命令行中用-o选项定义输出文件,将现有消息追加到该输出文件中

grib_filter -o outfile rules_file grib_file

如果-o选项没有指定,使用缺省值”filter.out“

  • append "filename_[key]";

-将当前message追加写入文件"filename_[key]"中,其中方括号内的key用message中检索到的值代替

-如果文件不存在则创建它

-如果两个message对于[key]有不同的值,它们同样写到不同文件中

例子5——append 声明

append;

---------------------------------------------------------------------
> grib_count out.grib
> 1
>
> grib_filter o out.grib rule.filter in.grib
>
> grib_count out.grib
> 2

规则语法——设置关键字

  • set key1 = key2 ; # 将key1的值设为key2 set key1 to the value of key2
  • set key = {val1,val2,val3,val4} ; # 设置一个关键字数组 set an array key
  • set key = "string" ; # 将关键字设成一个字符串 set key to a string
  • set key = expression ; # 将关键字设置成一个表达式 set key to an expression
  • set key = MISSING ; # 将关键字的值设置成缺失 set value of key to missing
  • 表达式运算符:

== 等于 equal to
!= 不等于 not equal to
is 等于字符串 equals to for strings
|| 或 or
&& 且 and
! 非 not
* / + - 算术运算符 arithmetic operators
( )

例子6——设置关键字

set _edition =2; 
write "[file][edition]";
---------------------------------------------------------------------
> grib_filter rule.filter x.grib
> ls
x.grib
x.grib2

例子7——设置一个数组关键字

set values = {12.2,14.8,13.7,72.3};
print "values = { [values] }";
write "[file].[edition]";
-----------------------------------------------------------------------
> grib_filter rule.filter x.grib
values = { 12.2 14.8 13.7 72.3 }

规则语法——临时关键字(transient keys)

  • transient key1 = key2; - 定义一个新的关键字key1并将它的值设置为key2  Defines the new key1 and assigns to it the value of key2
  • transient key1 = "string";
  • transient key1 = expression;
  • 表达式运算符:

== 等于 equal to
!= 不等于 not equal to
is 等于字符串 equals to for strings
|| 或 or
&& 且 and
! 非 not
* / + - 算术运算符 arithmetic operators
( )

例子8——临时关键字

transient mystep = step + 24;
print "step = [step] mystep = [mystep]";
-----------------------------------------------------
> grib_filter rule.filter x.grib
step = 24 mystep = 48

实例(略)

规则语法——if 声明

  • if ( expression ) { instructions }                                      没有'else if'-你需要创建一个新的'if'块
  • if ( expression ) { instructions }
    else { instructions }
  • 表达式运算符:

== 等于 equal to
!= 不等于 not equal to
is 等于字符串 equals to for strings
|| 或 or
&& 且 and
! 非 not
* / + - 算术运算符 arithmetic operators
( )

例子9——if声明

if (localDefinitionNumber == 1) {
set edition = 2;
write;
}
--------------------------------------------------------
> grib_filter o out.grib2 rule.filter x.grib1
> ls
out.grib2

规则语法——swich 声明

是'if-else'声明的替代版

当你有代码需要从许多要跟随的路径中选择一个时,更方便

switch (var) {
case val1:
# set of actions
case val2:
# set of actions
default
# default block of actions
}

默认:case是强制的,即使if是空的

例子10——switch声明

print "processing [paramId] [shortName] [stepType]";
switch (shortName) {
case "tp" :
set stepType accum";
case "sp" :
set typeOfLevel ="surface";
default:
print "Unexpected parameter";
}
write;

例子11

if (centre is "lfpw" &&
(indicatorOfParameter == 6 ||
indicatorOfParameter == 11 ||
indicatorOfParameter == 8) )
{
if (step!=0) {
set typeOfGeneratingProcess=0;
set typeOfProcessedData=0;
} else {
# Other steps
set typeOfProcessedData=1;


switch (typeOfLevel) {
case "hybrid":
set changeDecimalPrecision=1;
case "surface":
set changeDecimalPrecision=2;
case "isobaricInhPa":
if (level > 300) {
print "level > 300);
set level = level*2 + 15;
}# end if (level > 300)
default:
print "Unknown level type!";
}# end switch (typeOfLevel)
}# end if (step!=0)
write;
}# end main if

规则语法——assert 声明

  • assert(condition);
  • 如果状态评估是假则filter会丢弃
# This filter should be run on GRIB edition 1 only;
# abort otherwise
assert (edition == 1) ;
...
> grib_filter o out.grib2 rule.filter x.grib2
ECCODES ERROR : Assertion failure:
binop (access('edition=2'),long(2))

最新文章

  1. Nginx服务器 之反向代理与负载均衡
  2. 人才市场的IT职位分析
  3. BZOJ 3236: [Ahoi2013]作业
  4. Struts2二级菜单联动
  5. oracle 自增ID
  6. 利用Ajax+MSMQ(消息队列)+WebService实现服务器端向客户端的信息推送
  7. 方法的覆盖(override)、重载(overload)和重写(overwrite)
  8. 【MySQL】MySQL无基础学习和入门之一:数据库基础概述和实验环境搭建
  9. poj 1330 Nearest Common Ancestors LCA
  10. 替换应用程序exe图标,主要使用BeginUpdateResource,UpdateResource API函数
  11. bzoj 3226 [Sdoi2008]校门外的区间(线段树)
  12. Java实现简单版SVM
  13. 在centos中使用vim编辑器
  14. [Immutable,js] Immutable.Record() as data models
  15. makinacorpus/spynner
  16. openstack私有云布署实践【0 前言】
  17. phpcms v9栏目列表调用每一篇文章内容方法
  18. notes for python简明学习教程(2)
  19. build.xml编译报错Specified VM install not found: type Standard VM, name jdk1.7.0_45
  20. Java 内存模型简单剖析

热门文章

  1. LVS的NAT,TUN,DR原理及区别
  2. 关于js对象的键
  3. 【11】java之抽象类
  4. 解决点击el-dialog对话框,body抖动问题
  5. HTML初步了解
  6. java正则解析ip
  7. Lucky Chains(最大公约数的应用)
  8. loader的原理
  9. DOM状态监听(观察者模式)
  10. SpringBoot Circular view path错误