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 么?当然可以,看看例子吧:
#这是第三个文件, 也有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 拼接是和文件列表的顺序有关的。
我不想用制表符来间隔,我想用星号(*)来间隔,可以么?答案是可以的,使用-d选项就可以设定间隔符。来一起看看例子:
[roc@roclinux ~]$ paste -d '*' p3.txt p2.txt p1.txt I*a*1 II*b*2 III*c*3
要注意一点,此处一定要把星号用引号括起来(单引号双引号均可),否则 Shell 会把星号扩展为当前目录下的文件列表,千万小心。
“示例”胜于雄辩,我们通过例子来解释-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 命令我们就介绍到这里了,几个知识点都不复杂,相信聪明的你早已经掌握了。