✍️ 田冬冬 • 📅 2024-09-09

# -q 选项

-q 选项用于对输入或输出的行进行筛选，该选项在一定程度上可以代替 gawk 的某些功能。其基本语法为：

> -q[i|o][~]rows[+c col][+a|f|s]

i 和 o 分别表示只作用于输入或输出。

rows 用于指定要读入的行号或行号范围，多个行号或行号范围间用逗号分隔。 行号范围的格式为 start[:inc]:stop，若未指定 inc 则默认为1。

默认情况下（即 +a），行号是在整个数据集（多个文件算作一个数据集）中不断递增的； 使用 +f 表示对每个文件分别计算行号；使用 +s 表示对每个数据段分别计算行号。 需要注意的是，文件头段记录或数据段记录不算在行号内，只有数据记录才计算行号。

也可以加上 +c col 以限制第 col 列的范围。此时，rows 的格式为 start/stop，即这一列的最小范围和最大范围。若省略 stop （但不省略 /）， 则表示从 start 起一直读或写到最后一行。

在 -q 选项开始处加上 ~ 可实现反向操作，即只输入或输出不符合 rows 限制的 范围的数据。

举几个例子，假如输入数据是一个包含两段的数据:

    >
    0  0  0
    1  1  1
    2  2  2
    3  3  3
    4  4  4
    >
    5  5  5
    6  6  6
    7  7  7
    8  8  8
    9  9  9

只读入数据的第1和第4行:

    $ gmt convert input.dat -q0,3
    0   0       0
    3   3       3

读入数据的第2-4行以及第8行之后的行:

    $ gmt convert input.dat -q1:3,7
    >
    1   1       1
    2   2       2
    3   3       3
    >
    7   7       7

对于多段数据，每段单独计算行号，读入每段数据的第2至4行:

    $ gmt convert input.dat -q1:3+s
    >
    1   1       1
    2   2       2
    3   3       3
    >
    6   6       6
    7   7       7
    8   8       8

检查第3列数据，只保留其值在4到8之间的记录:

    $ gmt convert input.dat -q4:8+c2
    >
    4   4       4
    >
    5   5       5
    6   6       6
    7   7       7
    8   8       8