Contents

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会做什么?在上面的示例中, File1File2中的行数都是五。让我们在File2的末尾添加一个新行:

$ echo "12°c" >> File2

如果我们再次在File1File2上运行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

请注意,对于合并单个文件的行,将其名称作为参数传递是行不通的。我们需要像上面那样使用catpipe组合,或者重定向stdin ( < )

当然,我们可以将它与定界符结合起来。在这个例子中,当我们使用三个破折号时,输入文件中每三个连续的行将被合并,并用“ : ”分隔:

$ cat File1 | paste -d ":" - - -
New York:Philadelphia:Virginia
Washington:Texas:

请注意,File1只有五行。这就是为什么第二行的最后一个成员是空的。

最后,除了使用catpipe之外,还可以在终端中插入或粘贴数据:

$ paste - - > File4
Alaska
Florida
Michigan
Arizona
California

在这种情况下,我们将输出重定向到一个文件以保存结果。请注意,在我们插入所有数据后,我们应该同时按 ^D (CTRL + D),结束进程并发出文件结束信号。如果我们看一下File4,我们可以看到paste每两行合并一次:

$ cat File4
Alaska       Florida
Michigan     Arizona
California

请注意,如果我们不使用重定向,在每次“输入”后,我们按下终端将回显输入数据,并且paste命令将不起作用。