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

在目录下文件特别多的时候会方便一些。

posted @ 2020-01-10 15:33  MrDoghead  阅读(729)  评论(0编辑  收藏  举报