---
author: 田冬冬
date: 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
```
