paste命令_Linux paste命令:合并(拼接)文件

paste 的拼接原理是什么?这个很简单,和 cut 的原理几乎一样,就是将几个文件的相应行用制表符(Tab)连接起来,并输出到标准输出。

我们来看 paste 最简单的使用方法:

#第一个文件, 含有三行内容
[roc@roclinux ~]$ cat p1.txt
1
2
3
 
#第二个文件, 也含有三行内容
[roc@roclinux ~]$ cat p2.txt
a
b
c
 
#拼接两个文件
[roc@roclinux ~]$ paste p1.txt p2.txt
1    a
2    b
3    c
 
#可以看出, paste使用了制表符(Tab)作为间隔符
[roc@roclinux ~]$ paste p1.txt p2.txt|sed -n l
1\ta$
2\tb$
3\tc$

可以看到,paste 将两个文件的对应行用制表符进行了拼接。

两个行数不同的文件如何拼接

对于行数不同的两个文件,paste 采用尽力拼接的原则,对于超出的行,则只能单独展示了,毕竟巧妇难为无米之炊嘛。我们来看一个例子:

#第一个文件, 有5行
[roc@roclinux ~]$ cat s1.txt
a
b
c
d
e
 
#第二个文件, 有3行
[roc@roclinux ~]$ cat s2.txt
1
2
3
 
#拼接s1和s2
[roc@roclinux ~]$ paste s1.txt s2.txt
a       1
b       2
c       3
d
e
 
#拼接s2和s1, 注意, 参数的顺序对输出是有影响的
[roc@roclinux ~]$ paste s2.txt s1.txt
1       a
2       b
3       c
        d
        e

应该不需要再解释了,例子已经把 paste 的拼接原理展示得淋漓尽致了。

三个文件能 paste 么

刚才的例子是 paste 两个文件,那三个文件可以 paste 么?当然可以,看看例子吧:

#这是第三个文件, 也有3行
[roc@roclinux ~]$ cat p3.txt
I
II
III
 
#按p1、p2、p3的顺序拼接
[roc@roclinux ~]$ paste p1.txt p2.txt p3.txt
1    a    I
2    b    II
3    c    III
 
#按p3、p2、p1的顺序拼接
[roc@roclinux ~]$ paste p3.txt p2.txt p1.txt
I    a    1
II   b    2
III  c    3

paste 好强大,多个文件,照样能够按行拼接。而且会发现,paste 拼接是和文件列表的顺序有关的。

paste 的拼接符只能是制表符么

我不想用制表符来间隔,我想用星号(*)来间隔,可以么?答案是可以的,使用
-d选项就可以设定间隔符。来一起看看例子:

[roc@roclinux ~]$ paste -d '*' p3.txt p2.txt p1.txt
I*a*1
II*b*2
III*c*3

要注意一点,此处一定要把星号用引号括起来(单引号双引号均可),否则
Shell 会把星号扩展为当前目录下的文件列表,千万小心。

说说 paste 命令的 -s 选项

“示例”胜于雄辩,我们通过例子来解释
-s选项的作用:

#这是第一个文件
[roc@roclinux ~]$ cat p1.txt
1
2
3
 
#这是第二个文件
[roc@roclinux ~]$ cat p2.txt
a
b
c
 
这是第三个文件
[roc@roclinux ~]$ cat p3.txt
I
II
III
 
#我们使用了-s选项, 注意观察
[roc@roclinux ~]$ paste -s -d "*" p1.txt p2.txt p3.txt
1*2*3
a*b*c
I*II*III

这下看懂了吧,
-s就是以每个文件自身为一个处理单元,将此文件中的所有行以
-d选项设定的间隔符拼接成一大行,并输出到标准输出中。

好了,paste 命令我们就介绍到这里了,几个知识点都不复杂,相信聪明的你早已经掌握了。

点赞