-i 和 -o 选项

-i-o 选项分别用于对输入和输出的数据进行列选择以及简单的代数运算。

经常遇到的情况是,已有的数据有很多列,而某个命令只需要其中的某几列;或者某个命令的默认输出有很多列,却只想要输出其中的某几列。

-i 选项可以从输入数据中选择任意列,并对其进行四则运算以及取对数操作。其语法为:

-icols[+l][+ddivisor][+sscale|d|k][+ooffset][,][,t[word]]

-o 选项用于输出指定的列。其基本语法为:

-ocols[,…][,t[word]]

-i-o 选项后接以逗号分隔的列号(列号从0开始)或列号范围,以指定输入/输出数据中需要保留的列及其顺序。列号范围的格式为 start[:inc]:stop,若省略 inc 则默认其值为 1;若 stop 省略则一直读到最后一列。每一列均可重复多次出现。

若输入数据中既包含数值列也包含文本列,在不使用 -i 选项时,默认会读入所有列;而使用 -i 选项时,默认会丢弃所有尾部文本列。可以加上 t 以保留文本列,进一步可以指定 word 以指定保留文本列的第几列。

  • -in 表示只读入数值列,而忽略所有尾部文本列

  • -on 表示只输出数值列,而忽略所有尾部文本列

  • -ot 表示只输出文本列,而忽略所有数值列

对于 -i 选项而言,每个列号后还可以加上子选项以对每列数据进行简单的代数运算:

  • +l 表示对当前列取 \(\log_{10}\)

  • +ddivisor 表示将当前列除以 divisor [默认为 1]

  • +sscale 表示将当前列乘以比例因子 scale [默认为 1]。可将 scale 替换为 d 将单位从千米转换为度;替换为 k 则使用 PROJ_MEAN_RADIUS 将度转换为千米。

  • +ooffset 表示将当前列的值加上 offset [默认为 0]

备注

  1. 上述子选项的执行顺序为:(1)取 log10,(2)缩放,(3)添加偏移 offset

  2. 如果同时使用了 -i-o 选项,则 -o 选项使用 -i 选择后的列

举几个例子:

  • -i3,6,2 表示读入数据中的第 4、7、3 列

  • -o3,1,3 表示输出数据中的第 4、2、4 列,即第四列会被输出两次

  • -i1:3,5 表示读入数据中的 2-4 列和第 6 列

  • -i2+s2+o10,6,3 表示读入数据的第 3、7、4 列,并对第 3 列数据乘以 2 再加上 10

下面再举几个具体的实例:

取输入的 1-3 列:

$ echo 0 1 2 3 4 TEXT0 TEXT1 TEXT2 | gmt convert -i1:3
1   2       3

取输入的第 2 列并乘以 10 加上 5,并取第三列之后的所有列:

$ echo 0 1 2 3 4 TEXT0 TEXT1 TEXT2 | gmt convert -i1+s10+o5,2:
15  2       3       4

在上例基础上,取输入的所有文本列:

$ echo 0 1 2 3 4 TEXT0 TEXT1 TEXT2 | gmt convert -i1+s10+o5,2:,t
15  2       3       4       TEXT0 TEXT1 TEXT2

在上例基础上,只取文本列的第 2 列:

$ echo 0 1 2 3 4 TEXT0 TEXT1 TEXT2 | gmt convert -i1+s10+o5,2:,t1
15  2       3       4       TEXT1