linux命令paste引发的思考

paste命令用于将两个文件合并在一起,也可以将一个文件多行变成一行

选项描述
-d<间隔字符>或–delimiters=<间隔字符>用指定的间隔字符取代跳格字符。
-s或–serial串列进行而非平行处理。
–help在线帮助。
–version显示帮助信息。

假设有两个文件test1.txt和test2.txt

none@aa:~$ cat test1.txt 
user1
passwd1
user2
passwd2
user3
passwd3
none@aa:~$ cat test2.txt 
user1
passwd1
user2
passwd2
user3
passwd3

将test1.txt和test2.txt按行一一对应并且以:为分隔符拼接在一起,不接-d参数就是默认以一个tab为分隔符

none@aa:~$ paste -d : test1.txt test2.txt 
user1:user1
passwd1:passwd1
user2:user2
passwd2:passwd2
user3:user3
passwd3:passwd3

 将test1.txt和test2.txt各输出成一行并用:来分割原来的行

none@aa:~$ paste -sd : test1.txt test2.txt 
user1:passwd1:user2:passwd2:user3:passwd3
user1:passwd1:user2:passwd2:user3:passwd3

 将test1.txt和test2.txt的内容按各文件内容输出成一行并以:和\n轮流分割各个文件的内容

user1

passwd1

user2

passwd2

user3

passwd3

所以test1.txt和test2.txt就会分别分割成user1:passwd1\nuser2:passwd2\nuser3:passwd3这种样式,因为在linux中\n会转义成换行,结果就会导致下列输出形式,这在将同一个文件中的字段1和字段2合成为一个字段或者将第n行和第n+1行合并成一个字段很有用

none@aa:~$ paste -sd ':\n' test1.txt test2.txt 
user1:passwd1
user2:passwd2
user3:passwd3
user1:passwd1
user2:passwd2
user3:passwd3
none@aa:~$ paste -sd '=\n' test1.txt test2.txt 
user1=passwd1
user2=passwd2
user3=passwd3
user1=passwd1
user2=passwd2
user3=passwd3

 将test1.txt的内容输出为一行

none@aa:~$ paste -s test1.txt 
user1	passwd1	user2	passwd2	user3	passwd3

将test1.txt的内容输出为一行并且用:分割原来的行

none@aa:~$ paste -sd : test1.txt 
user1:passwd1:user2:passwd2:user3:passwd3

paste从标准输入中接收字符串,- -表示每次执行pasete -d :命令时从test1.txt中接收两个字符串,直到test1.txt中的数据被取完,命令执行完毕,为什么可以这么做?其实-就相当于一个占位符一样,用来接收参数,举个例子,用cat显示文本

none@aa:~$ paste -d : - -  < test1.txt
user1:passwd1
user2:passwd2
user3:passwd3

 echo 'hello' | cat test1.txt只显示了test1.txt的内容,其实echo的命令是被执行了的,只是没有被显示出来,而echo 'hello' | cat test1.txt - 则用-接收了echo 'hello'的标准输出,并作为cat的标准输入

none@aa:~$ echo 'hello' | cat test1.txt 
user1
passwd1
user2
passwd2
user3
passwd3
none@aa:~$ echo 'hello' | cat test1.txt -
user1
passwd1
user2
passwd2
user3
passwd3
hello

 paste -sd ':\n' - - < test1.txt test2.txt 则会多了个空行

none@aa:~$ paste -sd ':\n' - - < test1.txt test2.txt 
user1:passwd1
user2:passwd2
user3:passwd3

user1:passwd1
user2:passwd2
user3:passwd3

想去掉空行也不是没有办法,可以用sed命令

none@aa:~$ paste -sd ':\n' - - < test1.txt test2.txt | sed '/^\s*$/d'
user1:passwd1
user2:passwd2
user3:passwd3
user1:passwd1
user2:passwd2
user3:passwd3

 到这里好像一切都很顺利,一套操作行云流水,但是

none@aa:~$ paste -ds ':\n' test1.txt test2.txt 
paste: ':\n': No such file or directory
none@aa:~$ paste -ds ':\n' test1.txt 
paste: ':\n': No such file or directory
none@aa:~$ paste -ds ':' test1.txt 
paste: ':': No such file or directory
none@aa:~$ paste -ds ':\n' - - < test1.txt test2.txt
paste: ':\n': No such file or directory

无法接受的是,为什么换成ds就出错了,原本以为自己用了那么多年linux,对命令行是比较熟悉的了命令的参数好像没有什么位置要求,例如tar xzvf file、tar zxvf file这样用都没问题为什么到了这里就出问题了,仔细一看,我们这里多了一个-d的描述符,-d指定分隔符,当遇到段命令连用时,如果有带描述符的,一定要放到最后不然可能就会造成困扰

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值