Linux【2】-管理文件-4-linux文件的合并(paste、join)

一、基本的命令

1.1 paste详解

[root@www ~]# paste [-d] file1 file2
选项与参数:
-d  :后面可以接分隔字符。默认是以 [tab] 来分隔的!
-   :如果 file 部分写成 - ,表示来自 standard input 的数据的意思。

范例一:将 /etc/passwd 与 /etc/shadow 同一行贴在一起

[root@www ~]# paste /etc/passwd /etc/shadow
bin:x:1:1:bin:/bin:/sbin/nologin        bin:*:14126:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:*:14126:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin    adm:*:14126:0:99999:7:::
# 注意喔!同一行中间是以 [tab] 按键隔开的!

范例二:先将 /etc/group 读出(用 cat),然后与范例一贴上一起!且仅取出前三行

[root@www ~]# cat /etc/group|paste /etc/passwd /etc/shadow -|head -n 3
# 这个例子的重点在那个 - 的使用!那玩意儿常常代表 stdin 喔!

例:使用chpasswd批量修改用户密码

[root@localhost ~]# cat name 
user1:
user2:
user3:
user4:

[root@localhost ~]# cat passwd 
978ebbf1763
23c2626c37b
15dff03fa71
2459043b3ad

[root@localhost ~]# paste name passwd 
user1:    978ebbf1763
user2:    23c2626c37b
user3:    15dff03fa71
user4:    2459043b3ad

[root@localhost ~]# paste -d"#" name passwd 
user1:#978ebbf1763
user2:#23c2626c37b
user3:#15dff03fa71
user4:#2459043b3ad

注:-d指定分隔符,不加此参数默认为制表符。

行数不同的拼接

对于行数不同的两个文件,paste 采用尽力拼接的原则,对于超出的行,则只能单独展示了

#第一个文件, 有5行
[roc@roclinux ~]$ cat s1.txt
a
b
c
d
e
 
#第二个文件, 有3行
[roc@roclinux ~]$ cat s2.txt
1
2
3
 
#拼接s1和s2
[roc@roclinux ~]$ paste s1.txt s2.txt
a       1
b       2
c       3
d
e
 
#拼接s2和s1, 注意, 参数的顺序对输出是有影响的
[roc@roclinux ~]$ paste s2.txt s1.txt
1       a
2       b
3       c
        d
        e
三个文件能 paste 么

刚才的例子是 paste 两个文件,那三个文件可以 paste 么?当然可以,看看例子吧: #这是第三个文件, 也有3行

[roc@roclinux ~]$ cat p3.txt
I
II
III
 
#按p1、p2、p3的顺序拼接
[roc@roclinux ~]$ paste p1.txt p2.txt p3.txt
1    a    I
2    b    II
3    c    III
 
#按p3、p2、p1的顺序拼接
[roc@roclinux ~]$ paste p3.txt p2.txt p1.txt
I    a    1
II   b    2
III  c    3

paste 好强大,多个文件,照样能够按行拼接。而且会发现,paste 拼接是和文件列表的顺序有关的。

说说 paste 命令的 -s 选项

“示例”胜于雄辩,我们通过例子来解释-s选项的作用:

#这是第一个文件
[roc@roclinux ~]$ cat p1.txt
1
2
3
 
#这是第二个文件
[roc@roclinux ~]$ cat p2.txt
a
b
c
 
这是第三个文件
[roc@roclinux ~]$ cat p3.txt
I
II
III
 
#我们使用了-s选项, 注意观察
[roc@roclinux ~]$ paste -s -d "*" p1.txt p2.txt p3.txt
1*2*3
a*b*c
I*II*III

这下看懂了吧,-s就是以每个文件自身为一个处理单元,将此文件中的所有行以-d选项设定的间隔符拼接成一大行,并输出到标准输出中。

1.2 join

将有相同数据的那一行合并在一起。

$ join [-ti12] file1 file2
-t :分隔符,默认为空格
-i :忽略大小写的差异
-1 :第一个文件所用的比较字段
-2 :第二个文件所用的比较字段

二、讨论

2.2 两个文件合并

一个文件在上,一个文件在下

cat file1 file2 > file3

一个文件在左,一个文件在右

paste file1 file2 > file3

参考文献

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn