菜鸟科技网

Linux paste命令如何合并多文件内容?它有哪些鲜为人知的高级用法?

paste 命令是一个非常实用但有时容易被忽略的工具,它的核心功能是 将多个文件的相应行合并(连接)起来,并将结果输出到标准输出(通常是你的终端)。

Linux paste命令如何合并多文件内容?它有哪些鲜为人知的高级用法?-图1
(图片来源网络,侵删)

你可以把它想象成办公软件中的“并排粘贴”功能,或者像把多列数据横向拼接在一起。


基本语法

paste [选项]... [文件]...
  • 选项: 用于控制 paste 的行为。
  • 文件: 指定一个或多个要合并的文件,如果不指定文件,或者使用 作为文件名,paste 会从标准输入读取数据。

核心工作原理

paste 逐行处理输入文件,它会:

  1. 同时读取所有输入文件的第一行。
  2. 用指定的分隔符(默认是制表符 \t)将它们连接起来。
  3. 输出合并后的第一行。
  4. 然后读取所有输入文件的第二行,重复上述过程。
  5. 直到所有文件中最长的文件被处理完毕。

重要特性: 如果某个文件比其他文件短,paste 会用空行来填充,直到所有文件都处理完毕,这与 paste 的“兄弟”命令 join 不同,join 只处理两个文件中键值匹配的行。


常用选项详解

a. -d--delimiters

这是最常用的选项,用于指定合并行时使用的分隔符。

Linux paste命令如何合并多文件内容?它有哪些鲜为人知的高级用法?-图2
(图片来源网络,侵删)

示例 1: 默认使用制表符 假设有两个文件 file1.txtfile2.txt:

# file1.txt
apple
banana
cherry
# file2.txt
red
yellow
green

执行 paste file1.txt file2.txt:

apple    red
banana   yellow
cherry   green

可以看到,applered 之间是一个制表符。

示例 2: 使用逗号作为分隔符

paste -d, file1.txt file2.txt

输出:

apple,red
banana,yellow
cherry,green

示例 3: 使用多个字符作为分隔符 你可以使用 -d 后跟一个字符序列,paste 会按顺序循环使用这些字符。

# file3.txt
10
20
30
40
# file4.txt
A
B
C

执行 paste -d":;" file3.txt file4.txt file1.txt:

  • 第一行用 连接
  • 第二行用 连接
  • 第三行又用 连接
  • 第四行 file3.txt 有内容,但 file4.txtfile1.txt 没有,所以用空格填充。

输出:

10:A:
20;B:
30:C:
40: :

b. -s--serial

这个选项改变 paste 的行为,它不再将不同文件的合并,而是将同一个文件内的行合并。

示例:

paste -s file1.txt

输出:

apple    banana    cherry

file1.txt 的所有行被合并成了一行,并用默认的制表符分隔。

你还可以指定分隔符:

paste -s -d, file1.txt file2.txt

输出:

apple,banana,cherry red,yellow,green

file1.txt 的所有行用逗号合并成一行,file2.txt 的所有行也用逗号合并成一行,然后这两大行再用制表符连接。


实用示例

示例 1: 创建 CSV 文件

假设你有一个用户名列表 users.txt 和一个对应的密码列表 passwords.txt,你可以用 paste 快速创建一个 CSV 文件。

# users.txt
alice
bob
charlie
# passwords.txt
secret123
password456
qwerty789
paste -d, users.txt passwords.txt > users_passwords.csv

生成的 users_passwords.csv 内容如下:

alice,secret123
bob,password456
charlie,qwerty789

示例 2: 从日志中提取多列信息

假设你有一个日志文件 access.log,每行格式为 IP - - [timestamp] "request" status size,你想提取 IP 地址、请求方法和状态码。

# access.log (示例行)
192.168.1.100 - - [10/Oct/2025:13:55:36 +0800] "GET /index.html HTTP/1.1" 200 1234
10.0.0.5 - - [10/Oct/2025:13:56:01 +0800] "POST /login HTTP/1.1" 302 567

我们可以用 cut 命令先提取出需要的列,然后用 paste 组合。

# 提取IP (第1列), 请求方法 (第6列), 状态码 (第9列)
cut -d' ' -f1,6,9 access.log | paste -d, - -

命令分解:

  1. cut -d' ' -f1,6,9 access.log: 提取 IP、请求方法和状态码。-d' ' 指定空格为分隔符。
    168.1.100 GET 200
    10.0.0.5 POST 302
  2. paste -d, - -: paste 从标准输入读取(第一个 ),并将输入的每一行视为一个独立的“文件”来处理,由于只有“一个”输入文件,paste -s 的效果就显现出来了,它把每一行的内容合并起来。-d, 指定用逗号作为分隔符。
    168.1.100,GET,200
    10.0.0.5,POST,302

示例 3: 与命令行管道结合

paste 可以从标准输入读取数据,非常适合在管道中使用。

假设你想将 ls -l 的输出(每行一个文件)和 wc -l 的输出(总行数)合并显示。

# ls -l 的输出
total 16
-rw-r--r-- 1 user user  123 Oct 10 13:55 file1.txt
-rw-r--r-- 1 user user  456 Oct 10 13:56 file2.txt
# wc -l file1.txt file2.txt 的输出
      3 file1.txt
      3 file2.txt
      6 total

我们想得到这样的效果:

file1.txt: 3
file2.txt: 3

可以这样实现:

ls | paste -d: - <(wc -l *)

命令分解:

  1. ls: 列出当前目录的文件名(每行一个)。
  2. <(wc -l *): 这是进程替换。wc -l * 会计算当前目录所有文件的行数并输出。<(...) 将这个命令的输出当作一个临时文件,paste 可以读取它。
  3. paste -d: - <(...): paste 读取 ls 的输出()和 wc -l 的输出(临时文件),并用冒号 连接它们。

输出:

file1.txt: 3
file2.txt: 3

paste vs join

这是一个常见的混淆点,简单对比一下:

特性 paste join
目的 横向合并多行 纵向连接两个文件中共享关键字段的行
输入文件数 两个或多个 通常是两个
匹配逻辑 无需匹配,按行号顺序合并 必须指定一个或多个关键字段,只有关键字段值相同的行才会被合并
短文件处理 用空行填充 短文件中不匹配的行会被忽略
主要用途 创建多列数据、格式化输出 数据库式连接,基于键值合并数据

paste 命令虽然简单,但在处理文本数据、进行格式化输出和快速创建结构化文件(如 CSV)时非常高效,记住它的核心思想:按行横向合并,并熟练使用 -d-s 选项,你就能应对很多文本处理的场景了。

分享:
扫描分享到社交APP
上一篇
下一篇