paste 命令是一个用于合并文件的实用工具,它将多个文件按行合并,将每个文件的对应行用指定的分隔符连接起来,最后输出到标准输出。

核心功能
想象一下你有几个文件,它们的内容是按列排列的,而你希望将它们合并成一个文件,每一列都来自不同的源文件。
示例文件:
我们创建三个文件 file1.txt, file2.txt, 和 file3.txt:
# 创建 file1.txt $ echo -e "apple\nbanana\ncherry" > file1.txt $ cat file1.txt apple banana cherry # 创建 file2.txt $ echo -e "red\nyellow\npink" > file2.txt $ cat file2.txt red yellow pink # 创建 file3.txt $ echo -e "10\n20\n30" > file3.txt $ cat file3.txt 10 20 30
目标: 将这三个文件合并,得到如下格式的输出:

apple red 10
banana yellow 20
cherry pink 30
paste 命令就是用来完成这个任务的。
基本语法
paste [选项] 文件1 文件2 [文件3 ...]
- 文件列表: 可以是任意数量的文件。
- 如果不提供任何文件,
paste会从标准输入读取数据。 - 如果文件行数不一致,
paste会用空行来补齐较短的文件。
常用选项详解
-d 或 --delimiters
作用:指定合并时使用的分隔符,默认的分隔符是制表符 \t。
示例:使用逗号 作为分隔符。
$ paste -d "," file1.txt file2.txt file3.txt apple,red,10 banana,yellow,20 cherry,pink,30
示例:使用空格作为分隔符。

$ paste -d " " file1.txt file2.txt file3.txt apple red 10 banana yellow 20 cherry pink 30
示例:使用多个字符作为分隔符()。
$ paste -d "| " file1.txt file2.txt file3.txt apple | red | 10 banana | yellow | 20 cherry | pink | 30
-s 或 --serial
作用:将每个文件的所有行合并成一行,而不是按行合并文件,这会将每个文件的内容转换为一列。
示例:将 file1.txt 的所有行合并成一行。
$ paste -s file1.txt apple banana cherry
示例:将多个文件都各自合并成一行,然后横向排列。
$ paste -s file1.txt file2.txt file3.txt apple banana cherry red yellow pink 10 20 30
--help
作用:显示帮助信息并退出。
$ paste --help
--version
作用:显示 paste 命令的版本信息。
$ paste --version
高级用法与技巧
从标准输入读取
当没有提供文件名时,paste 会从标准输入读取数据,这在管道操作中非常有用。
示例:将 ls 的输出和 who 的输出合并。
# ls 的输出 $ ls -1 file1.txt file2.txt file3.txt # who 的输出 $ who user1 pts/0 2025-10-27 10:00 (192.168.1.100) user2 pts/1 2025-10-27 10:05 (192.168.1.101) # 使用 paste 合并 $ (ls -1; who) | paste -d "|" /dev/stdin /dev/stdin file1.txt|file1.txt file2.txt|file2.txt file3.txt|file3.txt user1 pts/0 2025-10-27 10:00 (192.168.1.100)|user1 pts/0 2025-10-27 10:00 (192.168.1.100) user2 pts/1 2025-10-27 10:05 (192.168.1.101)|user2 pts/1 2025-10-27 10:05 (192.168.1.101)
注意: /dev/stdin 是一个特殊文件,代表标准输入,这里我们使用它来两次读取标准输入流,以便将 ls -1 和 who 的输出(它们被合并到了一个标准输入流中)再次分开,这个技巧有点绕,但展示了 paste 处理标准输入的能力。
更常见的用法是配合 here documents 或 here strings。
示例:使用 here string。
$ paste -d "|" <(ls -1) <(who) file1.txt|user1 pts/0 2025-10-27 10:00 (192.168.1.100) file2.txt|user2 pts/1 2025-10-27 10:05 (192.168.1.101) file3.txt|
这里 <(...) 是进程替换,它会执行命令并将输出当作一个临时文件传给 paste。
处理不同长度的文件
paste 会自动处理文件长度不一致的情况,它会用空行来补齐较短的文件。
示例:创建一个长度不同的文件 file4.txt。
$ echo -e "grape\norange" > file4.txt $ cat file4.txt grape orange
合并 file1.txt (3行) 和 file4.txt (2行):
$ paste file1.txt file4.txt apple grape banana orange cherry
可以看到,file4.txt 因为只有两行,所以在第三行合并时,它提供了空内容。
paste vs join
paste 和 join 都可以合并文件,但它们的目的和用法完全不同。
| 特性 | paste |
join |
|---|---|---|
| 合并方式 | 按行横向拼接,不关心内容。 | 基于共同的键值进行连接,类似数据库的 JOIN 操作。 |
| 排序要求 | 不需要文件排序。 | 要求文件已按连接键排序。 |
| 用途 | 将独立的列数据合并成表。 | 关联两个具有共同字段的表格数据。 |
join 示例:
假设我们有 sales.txt 和 products.txt,它们都有一个共同的 ID 列。
$ cat sales.txt 1 100 2 150 3 200 $ cat products.txt 1 Apple 2 Banana 4 Orange
使用 join 合并:
$ join -t $'\t' sales.txt products.txt 1 100 Apple 2 150 Banana
join 只找到了 ID 为 1 和 2 的匹配项,并将它们合并,而 paste 会简单地把每一行拼在一起,不管 ID 是否匹配。
paste是一个简单但强大的文本处理工具,用于按行合并多个文件。- 默认使用制表符作为分隔符,可以通过
-d选项自定义。 -s选项可以将单个文件的多行合并为一行。- 它是处理按列存储的数据的利器,常用于数据预处理和报表生成。
- 与
join的核心区别在于:paste是机械的按行拼接,而join是智能的基于键值关联。
掌握 paste 命令,能让你在处理文本数据时更加得心应手。
