paste 命令把多行组合成多列。默认情况下,它从每个输入文件各取一行,用制表符连接,再重复此过程,直到所有输入都到达文件末尾。
文本操作 · 第 7 课
paste
学习使用 paste 合并对应行,或用可配置的分隔符把多行串成一行。
并排合并文件
创建两个小文件:
$ printf 'alice\nbob\n' > names.txt
$ printf 'admin\nviewer\n' > roles.txt
把两个文件传给 paste:
$ paste names.txt roles.txt
alice admin
bob viewer
列之间看见的空白是制表符。cat 会依次写出每个完整文件,而 paste 会组合各输入中的对应行。
first.txt 依次包含 A、B,second.txt 依次包含 1、2。paste first.txt second.txt 默认会产生什么?
选择分隔符
使用 -d LIST 替换默认制表符。例如改为冒号:
$ paste -d ':' names.txt roles.txt
alice:admin
bob:viewer
具有 shell 含义的分隔符需要加引号。列表包含多个字符时,paste 可以循环使用它们;构建两列时,单个字符最容易理解。
哪个命令会用冒号连接 names.txt 与 roles.txt 中的对应行?
把一个文件中的多行串成一行
-s 会串行处理每个输入文件,把其中各行连接为一个输出行。创建一个每行一个单词的文件:
$ printf 'The\nquick\nbrown\nfox\n' > words.txt
$ paste -s words.txt
The quick brown fox
把 -s 与 -d 组合,可以选择分隔符:
$ paste -s -d ' ' words.txt
The quick brown fox
在 -s 模式下提供多个文件时,每个文件都会成为一个输出行。
哪个命令会把 words.txt 中的所有行连接成一个以空格分隔的输出行?
处理长度不同的输入
并行输入文件行数不同时,paste 会继续运行到最长文件结束。较短文件缺失的值会成为空字段:
$ printf 'A\nB\nC\n' > letters.txt
$ printf '1\n2\n' > numbers.txt
$ paste -d ':' letters.txt numbers.txt
A:1
B:2
C:
并行传给 paste 的某个文件比其他文件更早结束时,会发生什么?
从 stdin 读取一个输入
使用 - 作为文件操作数,可以让该位置从 stdin 读取:
$ printf 'admin\nviewer\n' | paste -d ':' names.txt -
alice:admin
bob:viewer
在 producer | paste names.txt - 中,- 操作数表示什么?
要练习合并面向行的数据,可以尝试这个动手实验:
- 简单文本处理 - 学习使用
tr、col、join和paste等命令高效操作和分析文本数据。
课程已完成
你已完成 paste
现在,你可以使用可预测的对齐方式和分隔符组合面向行的输入。
合并多个文件中的对应行。
使用
-d替换默认制表符。使用
-s把一个文件中的各行串起来。理解较短输入产生的空字段。
在某个输入来自 stdin 时使用
-。