1. 简介
paste
命令用于合并文件中的行。将每个文件中按顺序对应的行(由制表符分隔)写入标准输出。如果没有文件,或者当文件为 -
时,读取标准输入。
2. 用法及选项
2.1 用法
paste [OPTION]… [FILE]…
2.2 选项
-
-d
DELIM-LIST , –delimiters=DELIM-LIST使用该选项指定的字符(集合)DELIM-LIST 中的字符(序列)代替制表符
\t
作为输出中分割各个输入文件的行的分隔符 。若 DELIM-LIST 为单个字符,则这个字符将作为输出中分隔各个文件的行的分隔符;
若 DELIM-LIST 为一组字符序列,则字符序列中的各个字符将作为输出中对应的各个文件的行之间的分隔符。当 DELIM-LIST 中字符序列中的字符数小于指定的输入文件的个数减 1 时,将循环使用 DELIM-LIST 中的字符作为分隔符。例如,当指定四个输入文件,但是指定的分隔符序列为
:-
,则输出中四个输入文件内容之间的三个分隔符分别为:-:
。 -
-s
一次粘贴一个文件,而不是并行的粘贴。
也就是说,把每个输入文件中的所有的行使用分隔符连接,然后作为输出中的每一行。
3. 使用示例
有两个文件,内容如下:
$ cat num
1 2
3 4
5 6
$ cat letter
a b c
d e f
g h i
j k
下面的例子将使用这两个文件。
3.1 不使用任何选项
不使用任何选项的情况下,paste
命令将把所有输入文件(包括标准输入)的内容按照对应的行拼接在一起并输出,输出中使用默认的分隔符(制表符)连接各个输入文件中对应的行。
$ paste num letter
1 2 a b c
3 4 d e f
5 6 g h i
j k
也可以同时指定多次指定一个文件:
$ paste num letter num
1 2 a b c 1 2
3 4 d e f 3 4
5 6 g h i 5 6
j k
将文件及标准输入中的行合并输出,
$ paste num - < letter
1 2 a b c
3 4 d e f
5 6 g h i
j k
# '- < letter' 表示将文本文件 letter 的内容重定向到标准输入,一个 `-` 表示重定向到一个文件
$ paste num - - < letter
1 2 a b c d e f
3 4 g h i j k
5 6
# '- - < letter' 表示将文本文件 letter 的内容重定向到标准输入,两个 `-` 表示重定向到两个文件,letter 文件
# 的内容将会按行循环分配给两个文件
理解了上面 -
的用法,那么下面的例子就不难理解了,即将 seq
命令的输入重定向到两个文件(标准输入),
$ seq 4 | paste - -
1 2
3 4
也可以重定向到三个文件:
$ seq 4 | paste - - -
1 2 3
4
3.2 指定分隔符(序列)
可以通过 -d
选项指定一个字符或者一个字符序列作为一个或者一组分隔符。
合并两个文件的内容,并指定空格作为分隔符:
$ paste -d ' ' num letter
1 2 a b c
3 4 d e f
5 6 g h i
j k
合并文件的行并重复文件 num2 的内容,且指定字符序列 :-
作为一组分隔符:
$ paste -d ':-' num letter num
1 2:a b c-1 2
3 4:d e f-3 4
5 6:g h i-5 6
:j k -
# 其中第一个文件 num 的行和第二个文件 letter 对应的行使用分隔符序列中的第一个字符 ':' 作为分隔符;
# 第二个文件 letter 的行和第三个文件 letter 对应的行使用分隔符序列中的第二个字符 '-' 作为分隔符;
指定四个输入文件,但是只指定 2 个分隔符,则将会循环使用指定的分隔符序列中的分隔符:
$ paste -d ':-' num letter num letter
1 2:a b c-1 2:a b c
3 4:d e f-3 4:d e f
5 6:g h i-5 6:g h i
:j k -:j k
# 其中第一个文件 num 的行和第二个文件 letter 对应的行使用分隔符序列中的第一个字符 ':' 作为分隔符;
# 第二个文件 letter 的行和第三个文件 letter 对应的行使用分隔符序列中的第二个字符 '-' 作为分隔符;
# 由于分隔符序列中已经没有第三个字符,所以又使用分隔符序列中的第一个字符作为第三个文件 num 和第四个
# 文件 letter 对应的行的分隔符。若还有第五个文件,那么将使用分隔符序列中的第二个字符作为分隔符,以此类推
3.3 保持文件内容(行)的完整性
在不使用 -s
选项的情况下,每个输入文件的行将会被分配到输出中的多个行中。使用 -s
选项可以使得每个输入文件中的所有的行使用分隔符连接,然后作为输出中的完整的一行。
$ paste -s num letter
1 2 3 4 5 6
a b c d e f g h i j k
$ paste -s -d ' ' num letter
1 2 3 4 5 6
a b c d e f g h i j k
3.4 使用 paste 命令编写一个行转列的脚本
#!/bin/bash
# filename: convert.sh
# convert row to column
rows=`cat $1 | wc -l`
for (( i=1; i<=$rows; i++)); do
sed -n ${i}p $1 | xargs -n1 > /tmp/$1_$i
done
paste /tmp/$1_*
rm /tmp/$1_*
有一个员工信息的文件 info.txt:
$ cat info.txt
Name Age Gender Dept
bob 24 male SQA
alex 28 male R&D
lucy 22 female HR
使用上述脚本将其尽心转换:
$ sh convert.sh info.txt
Name bob alex lucy
Age 24 28 22
Gender male male female
Dept SQA R&D HR