Linux按列暴力合并文件之Paste
介绍
之前已经分享过文件按行拼接的cat命令,以及join命令的按指定列合并文件,但是join必须要有指定匹配的列(默认为第一列),没办法随心所欲怎么办?比如现在有一个文件存有学号和姓名,而另一个文件有年龄和成绩,你知道两个文件的每一行是一一对应的,可是怎么合并呢?来试试paste吧,硬合并!
用法
首先,我们还是看一下官方文档
$ paste --help
Usage: paste [OPTION]... [FILE]...
Write lines consisting of the sequentially corresponding lines from
each FILE, separated by TABs, to standard output.
With no FILE, or when FILE is -, read standard input.
Mandatory arguments to long options are mandatory for short options too.
-d, --delimiters=LIST reuse characters from LIST instead of TABs
-s, --serial paste one file at a time instead of in parallel
--help display this help and exit
--version output version information and exit
-d 指定不同于空格或tab键的域分隔符。例如用@分隔域,使用- d @。
-s 将每个文件合并成行而不是按行粘贴。
实例
假设我们现在有两个文件
$ cat file1
1 Alice
2 Bob
3 cheryl
4 Doghead
$ cat file2
11 60.0
22 70.0
33 80.0
4 90.0
然后直接按列合并一下,无需思考指定匹配列
$ paste file1 file2
1 Alice 11 60.0
2 Bob 22 70.0
3 cheryl 33 80.0
4 Doghead 4 90.0
想用不同的符合隔开?试试-d
$ paste -d@ file1 file2
1 Alice@11 60.0
2 Bob@22 70.0
3 cheryl@33 80.0
4 Doghead@4 90.0
想把文件『旋转』一下?
$ paste -s file1 file2
1 Alice 2 Bob 3 cheryl 4 Doghead
11 60.0 22 70.0 33 80.0 4 90.0
可以看到,竖着贴横着贴都没问题,反正就是暴力合并,怎么样?用它!
最后,paste其实还有一个用途,可以改变罗列的文件
不实用paste:
$ ls tf/data/train | head -10
part-00000.gz
part-00001.gz
part-00002.gz
part-00003.gz
part-00004.gz
part-00005.gz
part-00006.gz
part-00007.gz
part-00008.gz
part-00009.gz
使用paste:
$ ls tf/data/train | head -10 | paste -d" " - - - - -
part-00000.gz part-00001.gz part-00002.gz part-00003.gz part-00004.gz
part-00005.gz part-00006.gz part-00007.gz part-00008.gz part-00009.gz
在目录下文件特别多的时候会方便一些。