---
author: 田冬冬, 陈箫翰, 周茂, 姚家园
date: 2025-09-22
---

# ASCII 表

## ASCII 表简介

ASCII 表是最常见的数据形式，可以用编辑器直接编辑。ASCII 表常用于表示点、线或多边形。
表数据中有 N 行 M 列，每行称为一个记录，每列称为一个字段。
一个记录内的字段之间用空格、制表符、逗号或分号分隔。每个字段可以是整数（如 **12**）、
浮点数（如 **20.34**）、地理坐标（如 **12:23:44.5W**）、
绝对时间（如 **2010-10-20T10:30:53.250**）、相对时间（如 **30t**）。
此外，GMT 还可以处理大多数CVS（Comma-Separated Values）文件，包括被双引号扩起来的数字。
以如下文件为例，

```
# This is a comment line
# lon      lat  evdp
# This is another comment line
133.949  34.219  20
133.528  34.676  15
130.233  33.410  43
135.133  35.313  35
131.377  34.398  22
132.792  34.457  34
133.620  34.936  6
131.101  32.811  23
129.435  33.212  55
133.144  33.647  67
```

记录中以 **#** 开头的行，即第一列是 **#** 的记录，会被当做注释行直接忽略，
不算在 N 个记录之内。所以这个 ASCII 表可以认为有 10 行 3 列，三列数据分别代表经度、纬度和深度。

不同的模块和选项的组合通常会对数据的列数有不同的要求，每列数据的含义也会不同。
因而需要根据具体情况去准备数据。准备数据的过程中可能会用到 GMT 的 {doc}`/option/io` 以及 **gawk** 等工具。

在输出 ASCII 表时，字段之间默认用 TAB 键分隔，可以通过修改 {term}`IO_COL_SEPARATOR` 来设置字段的分隔符，

## 文件头记录

在第一个记录前，可以有一个或多个与数据无关的记录，称为文件头记录（file header records）。
以 **#** 开头的注释行也算作是文件头记录的一部分，只是其会被自动忽略。
其它不以 **#** 开头但与数据无关的行，也是文件头记录。当存在这些非注释行的文件头
记录时，则需要使用 {doc}`/option/h` 选项或设置参数 {term}`IO_N_HEADER_RECS`
跳过这些文件头记录。

下面的ASCII表中有四个文件头记录（3个注释行和1个非注释行），需要使用 **-h4** 选项
跳过该文件头段记录:

```
# This is a comment line
# lon      lat  evdp
# This is another comment line
2015-01-05 10:20:30.456 15 45 60 6.0
133.949  34.219  20
133.528  34.676  15
130.233  33.410  43
135.133  35.313  35
131.377  34.398  22
132.792  34.457  34
133.620  34.936  6
131.101  32.811  23
129.435  33.212  55
133.144  33.647  67
```

(table-ascii-multiple-segment)=

## 多段数据与数据段头记录

以绘制断层为例，在绘制断层的时候，可以将每条断层线的经纬度信息分别放在单独的
文件中。但当断层数量很多时，这样做会导致目录下有太多数据文件而混乱不堪。
为了解决类似的问题，GMT引入了多段数据的概念。

多段数据，顾名思义，就是一个文件中包含了多个数据段。为了区分每个数据段，需要在
每段数据的开头加上一个额外的数据段头记录（segment header records）来标记一段
新数据的开始。

数据段头记录总是以某个特定的字符作为开头，GMT默认的段头记录的标识符为 **>**，
即所有以 **>** 开头的行都会被认为是一个段头记录，其标志着新一段数据的开始。

下面是一个包含两个数据段的多段数据，每段数据分别构成一个多边形:

```
>
10  20
15  30
5   25
>
20  20
35  30
40  40
35  40
```

可以使用如下命令绘制上面的多段文件:

```
gmt plot input.dat -JX10c -R0/50/0/50 -Baf -W1p -Gred -pdf lines
```

用户可以通过设置 {term}`IO_SEGMENT_MARKER` 将段头记录的
标识符修改为任意字符，例如 **@**、__%__等。
{term}`IO_SEGMENT_MARKER` 可以取两个特殊的值：

- 取 **B** 表示用空行作为数据段的分隔符
- 取 **N** 表示用一个所有列都是NaN的记录作为数据段分隔符

同样，可以将 {term}`IO_SEGMENT_MARKER` 设置为两个以逗号分隔的字符，则为输入和
输出指定了不同的段分隔符。

(table-ascii-attrs)=

## 数据段头记录中的额外属性

数据段头记录不仅用于标记数据段的开始，还可以额外指定该段数据的其它属性。
比如在绘制线段时，可以在段头记录中加上如下一系列选项，以分别控制每段线段的
属性：

- **-W** 指定当前数据段的画笔颜色

- **-G** 指定当前数据段的填充色

- **-Z** 设置当前数据段对应的Z值，并从CPT文件中获取Z值对应的颜色作为其颜色

- **-L** 设置当前数据段的标签信息

- **-T** 设置当前数据段的一般描述信息

- **-Ph** 表明当前数据段构成的闭合多边形位于另一个闭合多边形的内部

- ...

下面的多段数据，分别设置两段数据拥有不同的画笔颜色和填充色:

```
> -W2p,red -Glightred
10  20
15  30
12  25
> -W2p,blue -Glightblue
22  20
30  30
40  50
35  44
```

可以使用如下命令绘制上面的多段数据:

```
gmt plot input.dat -JX10c -R0/50/0/50 -Baf -W1p -Gred -pdf lines
```

查看绘图结果可以发现，数据段头记录中的选项参数会覆盖命令行中相应选项的值。
