Linux中Paste命令简介
1. 概述
在本教程中,我们将讨论paste 命令。这个命令帮助我们以并行或顺序的方式合并多个文件的所有行。
2. 使用粘贴命令
我们将通过一个简单的例子开始探索paste。假设我们有一个文件File1,其中包含一些城市和另一个文件File2,每个文件都有一些随机平均温度:
$ cat File1
New York
Philadelphia
Virginia
Washington
Texas
$ cat File2
29°C
26°C
32°C
31°C
35°C
如果我们对这两个文件运行paste:
$ paste File1 File2
命令的输出将是:
New York 29°C
Philadelphia 26°C
Virginia 32°C
Washington 31°C
Texas 35°C
我们可以看到paste将输入文件的每一行组合成一个新行。这种合并称为并行合并。这意味着结果中的第 n 行是每个输入文件的第 n 行的串联,由制表符分隔。
我们也可以改变默认的合并方式,按顺序合并文件。我们可以为此使用*-s*选项:
$ paste -s File1 File2
New York Philadelphia Virginia Washington Texas
29°C 26°C 32°C 31°C 35°C
3.加入不同行数的文件
如果每个输入文件中的行数不一样,paste会做什么?在上面的示例中, File1和File2中的行数都是五。让我们在File2的末尾添加一个新行:
$ echo "12°c" >> File2
如果我们再次在File1和File2上运行paste,这将是输出:
$ paste File1 File2
New York 29°C
Philadelphia 26°C
Virginia 32°C
Washington 31°C
Texas 35°C
12°c
注意paste可以合并不同行号的文件。如果文件的第 n 行是空的,那么paste将放置一个空字符串。
让我们恢复对File2的更改并删除插入的最后一行,使用sed 命令:
$ sed -i '$d' File2
4.更改默认分隔符
** paste命令的默认分隔符是tab。*我们可以使用-d*选项将此分隔符更改为我们想要的任何内容:
$ paste -d ":" File1 File2
New York:29°C
Philadelphia:26°C
Virginia:32°C
Washington:31°C
Texas:35°C
在此示例中,我们使用“ : ”代替默认分隔符。我们可以使用任何字符,甚至像\n*这样的非文本字符作为分隔符。*
请注意,如果我们有两个输入文件,我们需要一个分隔符来分隔数据,但如果有两个以上的输入文件,我们可以定义一个或多个。让我们看看如何指定多个定界符。
5. 定义不同的分隔符
假设我们有另一个名为File3的文件,该文件还包含每个城市的温度,但现在以华氏度表示:
$ cat File3
84.2°F
78.8°F
89.6°F
87.8°F
95°F
我们可以使用不同的分隔符将此数据添加到我们之前的信息中:
$ paste -d ":," File1 File2 File3
New York:29°C,84.2°F
Philadelphia:26°C,78.8°F
Virginia:32°C,89.6°F
Washington:31°C,87.8°F
Texas:35°C,95°F
粘贴命令按照我们定义的顺序使用分隔符。因此,在此示例中,“ : ”是第一个分隔符,“ , ”是第二个分隔符。
**请注意,分隔符之间不应有任何空格。**例如,定义“ :, ”会给出不同的输出,因为在这种情况下,第二个分隔符将是空格:
$ paste -d ": ," File1 File2 File3
New York:29°C 84.2°F
Philadelphia:26°C 78.8°F
Virginia:32°C 89.6°F
Washington:31°C 87.8°F
Texas:35°C 95°F
请注意,在这种情况下,paste会忽略第三个定界符。对于三个输入文件,我们只需要两个分隔符。
6. 分隔符的使用顺序
如果我们为四个或更多文件定义两个分隔符怎么办?paste在这种情况下做什么?让我们为六个文件指定两个分隔符。为简单起见,我们将以随机顺序使用我们之前的三个文件,因为我们只想关注paste使用定界符的方式:
$ paste -d ":," File1 File2 File3 File2 File3 File1
New York:29°C,84.2°F:29°C,84.2°F:New York
Philadelphia:26°C,78.8°F:26°C,78.8°F:Philadelphia
Virginia:32°C,89.6°F:32°C,89.6°F:Virginia
Washington:31°C,87.8°F:31°C,87.8°F:Washington
Texas:35°C,95°F:35°C,95°F:Texas
我们可以看到paste使用分隔符的顺序是循环的。请注意,如果我们只定义一个分隔符,则该分隔符将用于分隔每个字段。
到这里为止,我们只是使用常规文件作为输入参数。如果我们想从stdin读取数据怎么办?
7. 从标准输入读取
我们可以从标准输入读取数据或使用管道重定向它。让我们修改之前的命令:
$ paste -d ":," File1 File2 File3
假设我们想从标准输入中读取File2。要使用paste从标准输入读取任何文件,我们应该使用破折号而不是文件名。然后我们可以使用,例如,cat 和pipe的通常组合来重定向标准输入:
$ cat File2 | paste -d ":," File1 - File3
New York:29°C,84.2°F
Philadelphia:26°C,78.8°F
Virginia:32°C,89.6°F
Washington:31°C,87.8°F
Texas:35°C,95°F
8. 合并一个文件的n个连续行
paste命令的另一个有趣用法是当我们想要合并一个文件的 n 个连续行时。通过我们放在paste前面的破折号的数量,我们指定应该将多少行输入合并在一起。
例如,如果我们在paste前面放两个破折号,每两行连续的输入将被合并:
$ cat File1 | paste - -
New York Philadelphia
Virginia Washington
Texas
请注意,对于合并单个文件的行,将其名称作为参数传递是行不通的。我们需要像上面那样使用cat和pipe组合,或者重定向stdin ( < )。
当然,我们可以将它与定界符结合起来。在这个例子中,当我们使用三个破折号时,输入文件中每三个连续的行将被合并,并用“ : ”分隔:
$ cat File1 | paste -d ":" - - -
New York:Philadelphia:Virginia
Washington:Texas:
请注意,File1只有五行。这就是为什么第二行的最后一个成员是空的。
最后,除了使用cat和pipe之外,还可以在终端中插入或粘贴数据:
$ paste - - > File4
Alaska
Florida
Michigan
Arizona
California
在这种情况下,我们将输出重定向到一个文件以保存结果。请注意,在我们插入所有数据后,我们应该同时按 ^D (CTRL + D),结束进程并发出文件结束信号。如果我们看一下File4,我们可以看到paste每两行合并一次:
$ cat File4
Alaska Florida
Michigan Arizona
California
请注意,如果我们不使用重定向,在每次“输入”后,我们按下终端将回显输入数据,并且paste命令将不起作用。