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指定分隔符,当遇到段命令连用时,如果有带描述符的,一定要放到最后不然可能就会造成困扰