Linux如何使用paste合并文件内容

作者:袖梨 2026-06-24
paste默认按行对齐合并,以最短文件为准,缺行处填空字段;-d需加引号且支持多字符循环分隔;-s选项对每个文件单独串行压缩,不跨文件合并。

paste默认行为:行对齐合并,短文件末尾补空

直接运行 paste file1 file2 就能按行号对齐拼接,每对行用制表符 t 分隔。这不是“取最长”,而是「以最短文件为准」:file1 有 10 行、file2 只有 7 行,输出只有 7 行,后 3 行被静默丢弃——paste 不报错、不警告、也不提示。

容易踩的坑:

  • 误以为会自动补齐:它不会补空行,只在对齐位置缺内容时填一个空字段(即两个 t 相邻)
  • 后续用 cut -d' ' 解析失败:因为默认是 t,不是空格;必须写 cut -f1,2 或显式 cut -d$'t'
  • 日志类场景下时间戳列缺失 → 整行失效,但你看不到告警

指定分隔符:-d 参数必须加引号,且支持多字符循环

-d 后面的分隔符字符串要加单引号或双引号,否则 shell 会拆开空格或特殊符号。比如 paste -d, file1 file2 是错的,应写 paste -d',' file1 file2

更关键的是:如果传多个分隔符,paste 会循环使用。例如:

paste -d',:' file1 file2 file3

→ file1 和 file2 之间用 ,,file2 和 file3 之间用 :,再往后又回到 ,,依此类推。

常见组合:

  • paste -d' ' file1 file2:强制用单空格(注意引号不能省)
  • paste -d'|' *.log:把所有日志文件按行并排,用竖线分隔
  • paste -d$'n' file1 file2:用换行符当分隔符(实际效果接近 cat,但仍是 paste 行为)

串行合并(-s):不是“两文件拼成一行”,而是每个文件单独压成一行

paste -s file1 file2 的输出是两行:第一行是 file1 所有内容连成一行,第二行是 file2 所有内容连成一行。它不跨文件合并,只是对每个输入文件做「内部串行」。

想把两个文件全部内容压进**同一行**,得绕一下:

  • 简单粗暴:paste -sd'' file1 file2 | tr 'n' ' '(把所有换行转空格,原格式丢失)
  • 更可控:paste -d' ' (先各自压行,再拼接)
  • 真要 CSV 风格单行输出:paste -sd, file1 file2 —— 这里 -s 作用于整个参数列表,所以是「所有输入内容串成一行,用逗号连」

配合标准输入:用 - 占位,避免临时文件

paste 支持用 - 表示从 stdin 读,这在管道中特别实用。典型模式:

  • 一边是文件,一边是命令结果:ps aux --no-headers | cut -d' ' -f1 | paste -d: /etc/passwd -
  • 给每行加序号:seq $(wc -l
  • 把两个命令输出横向拼接:ls *.log | paste -d, - (注意 <code> 是进程替换,不是重定向)

注意:paste 最多支持 32767 个输入源。批量合并几百个文件时,别直接 paste *.txt,用 find *.txt | xargs -n 100 paste 分批更稳。

最常被忽略的一点:它不校验行数是否匹配,也不提供填充策略选项——需要对齐补齐,得提前用 awksed 处理短文件,paste 自己不做这事。

相关文章

精彩推荐