CDO - 文件的操作
本篇随笔将介绍 CDO 文件的复制、拼接和拆分等功能
文件操作 File Operators
Apply
apply,operators [ infile1 infile2 ... ]
描述
对每个输入文件运行给定的操作 operators ,输入的文件必须用方括号括起来 [ infile1 infile2 ... ] ,参数 operators 是一个以空格为间隔的 CDO 操作列表,每一个操作都只能有一个输入和一个输出参数
operators ,STRING,以空格为间隔的 CDO 操作列表例子
计算绝对风速,并将所有时间合并在一起:1
cdo mergetime -apply,expr,wind="sqrt(u\*u+v\*v)" [ infile1 infile2 infile3 ] outfile
计算多个输入文件中变量 XXX 的平均值:
1
cdo ensmean -apply,selname,XXX [ infile1 infile2 infile3 ] outfile
Copy datasets 复制
<operator> infiles outfile
| Operators | Description |
|---|---|
| copy | 复制所有输入数据集 infiles 到输出数据集 outfile |
| cat | 连接所有输入数据集 infiles 并将结果追加到 outfile 的末尾,如果outfile不存在,则创建该文件 |
<operator>,outfile2 infile outfile1
| Operators | Description |
|---|---|
| tee | 复制 infile 到 outfile1 和 outfile2 ; outfile1 可以用其他 CDO 操作进一步处理, outfile2 则被写入磁盘存储起来;这个操作用于将中间结果存储到一个文件中 |
例子
计算 infile 日平均 outfile_dayavg 和月平均 outfile_monavg :1
cdo monavg -tee,outfile_dayavg dayavg infile outfile_monavg
<operator>[,ndup] infile outfile
| Operators | Description | Parameter |
|---|---|---|
| duplicate | 复制 infile 的内容,并将结果写入 outfile ;可选参数 ndup 用于设置副本的数量,默认为2 | ndup,INTEGER,副本的数量,默认为2 |
Pack data 封装
<operator> infile outfile
| Operators | Description |
|---|---|
| pack | 通过降低存储数字的精度,封装数据集,以减少数据存储量 |
Replace variables 替换
<operator> infile1 infile2 outfile
| Operators | Description |
|---|---|
| replace | 将 infile1 中的变量替换为 infile2 中的变量,并将结果写入 outfile ;infile1 和 infile2 需要具有相同的时间步数,所有变量名只能出现一次 |
Merge 合并
<operator> infiles outfile
| Operators | Description |
|---|---|
| merge | 合并时间步数相同但字段不同的多个数据集;输入数据集字段不同是指变量不同或者同一变量的 levels 不同;输出数据集的每个时间步的字段数是所有输入数据集中对应时间步的字段数的总和; |
| mergetime | 合并变量相同但时间步不同的多个数据集;输入数据集需要具有相同的结构,即在不同时间步上具有相同的变量;所有输入数据集的时间步最终都会在输出数据集中,并且所有的时间步都按时间先后排序 |
例子
合并具有相同的时间步数和不同的变量的数据集到一个新的数据集:1
cdo merge infile1 infile2 infile3 outfile
合并相同变量但不同时间步的数据集到一个新的数据集:
1
cdo mergetime infile1 infile2 infile3 infile4 outfile
<operator> infile1 infile2 outfile
| Operators | Description |
|---|---|
| mergegrid | 拼接 infile2 中的水平网格到 infile1 中,并将合并的结果输出到 outfile ;infile2 的水平网格应该 ≤ infile1 的水平网格,并且分辨率需要相同;两个输入数据集都需要具有相同的变量和相同的时间步数 |
<operator>[,nx[,names]] infiles outfile
将水平网格区域不同的输入数据集拼接到一个输出数据集中;所有输入数据集都需要具有相同的变量和相同的时间步数;如果输入数据集是一个结构化的经纬度网格,则输出一个新的结构化的经纬度网格;对于非结构化网格的输入数据集,输出按照输入的顺序连接起来
| Operators | Description |
|---|---|
| collgrid[,nx[,names]] | 将多个子区域的输入数据集拼接到一个输出数据集中 |
| Parameters | Type | Description |
|---|---|---|
| nx | INTEGER | x 方向上的区域数,默认为输入文件的数量 |
| ny | STRING | 以逗号分隔的变量的 name 列表,默认为所有变量 |
Split 拆分
<operator>[,parameters] infile obase
将 infile 拆分为多个部分,输出文件将命名为 <obase><xxx><suffix>,其中 xxx 取决于所选择的 operator , suffix 是由 infile 派生的文件名扩展名
| Operators | Description |
|---|---|
| splitcode | 拆分数据集,拆分的每个部分对应不同的 code number ; xxx: <obase>-01.nc |
| splitparam | 根据变量的 ID 拆分数据集,拆分的每个部分对应不同的变量的 ID ; xxx: <obase>var_ID.nc |
| splitname | 根据变量的名称拆分数据集,拆分的每个部分对应不同的变量的 name ; xxx: <obase>var_name.nc |
| splitlevel | 根据 level 拆分数据集,拆分的每个部分对应不同的 level ; xxx: <obase>level.nc |
| splitgrid | 根据水平网格的不同拆分数据集,拆分的每个部分对应不同的网格 ; xxx: <obase>01.nc |
| splitzaxis | 根据 z 轴的不同拆分数据集,拆分的每个部分对应不同 z 轴 ; xxx: <obase>01.nc |
| splittabnum | 根据 GRIB1 Parameter Table Number 拆分数据集; xxx: <obase>000.nc |
| Parameters | Type | Description |
|---|---|---|
| swap | STRING | 交换输出文件名中 <obase> 和 <xxx> 的位置 |
| uuid=<attname> | STRING | 向每个输出文件添加一个 UUID 作为全局属性 |
<operator> infile obase
将 infile 拆分为多个时间段,输出文件将命名为 <obase><xxx><suffix>,其中 xxx 取决于所选择的 operator , suffix 是由 infile 派生的文件名扩展名
| Operators | Description |
|---|---|
| splithour | 根据小时拆分数据集,拆分的每个部分代表不同的小时; xxx: <obase>00.nc |
| splitday | 根据日期拆分数据集,拆分的每个部分代表不同的天; xxx: <obase>01.nc |
| splitseas | 根据季节拆分数据集,拆分的每个部分代表不同的季节; xxx: <obase>DJF.nc |
| splityear | 根据年份拆分数据集,拆分的每个部分代表不同的年; xxx: <obase>2021.nc |
| splityearmon | 根据年月拆分数据集,拆分的每个部分代表不同的年和月; xxx: <obase>202101.nc |
| splitmon[,format] | 根据月份拆分数据集,拆分的每个部分代表不同的月; xxx: <obase>月.nc |
<operator>,nsets[,noffset[,nskip]] infile obase
根据参数 nsets 、 noffset 、 nskip 将 infile 拆分为多个相等的时间段,输出文件将命名为 <obase><xxx><suffix>,其中 xxx 为不同时间段的六位数编号, suffix 是由 infile 派生的文件名扩展名
| Operators | Description |
|---|---|
| splitsel,nsets[,noffset[,nskip]] | 根据参数 nsets 、 noffset 、 nskip 将 infile 拆分为多个时间段 |
| Parameters | Type | Description |
|---|---|---|
| nsets | INTEGER | 每个输出文件写入的时间步数,步长 |
| noffset | INTEGER | 在第一个时间步范围之前跳过的时间步数,开始(可选) |
| nskip | INTEGER | 在时间步之间跳过的时间步数,间隔(可选) |
<operator>,nx[,ny] infile obase
根据参数 nx 、 ny 将数据集拆分为多个区域不同的数据集;二维
| Operators | Description |
|---|---|
| distgrid,nx[,ny] | 根据参数 nx 、 ny 将 infile 拆分为多个区域 |
| Parameters | Type | Description |
|---|---|---|
| nx | INTEGER | x 方向上的区域数 |
| ny | INTEGER | y 方向上的区域数,默认为 1 |