7.Shell本章同步视频:https://edu.51cto.com/sd/e4874

2.join - join lines of two files on a common field

        join命令用来将两个文件中,制定栏位内容相同的行连接起来。找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。

        注意:join在对两个文件进行连接时,两个文件必须都是按照连接域排好序的,按其他域排序是无效的。

(1)语法

[dmtsai@study ~]$ join [-ti12] file1 file2

选项与参数:

-t  :join 默认以空格符分隔数据,并且比对『第一个字段』的数据,

如果两个档案相同,则将两笔数据联成一行,且第一个字段放在第一个!

-i:忽略大小写的差异;

-1  :这个是数字的 1 ,代表『第一个档案要用那个字段来分析』的意思;

-2  :代表『第二个档案要用那个字段来分析』的意思。

(2)用法

[root@localhost tmp]# cat join1

adm x 3 4 adm

bin x 1 1 bin

daemon x 2 2 daemon

lp x 4 7 lp

root x 0 0 root

[root@localhost tmp]# cat join2

adm x 4

bin x 1

daemon x 2

root x 0

sys x 3

[root@localhost tmp]# join join1 join2     #内连接

adm x 3 4 adm x 4        

bin x 1 1 bin x 1

daemon x 2 2 daemon x 2

root x 0 0 root x 0

[root@localhost tmp]# join join2 join1

adm x 4  x 3 4 adm      #注意参数先后顺序的结果

bin x 1  x 1 1 bin

daemon x 2  x 2 2 daemon

root x 0  x 0 0 root

#不指定任何参数的情况下使用join命令,就相当于数据库中的内连接,关键字不匹配的行不会输出。

[root@localhost tmp]# join -a1 join1 join2    #左连接

adm x 3 4 adm x 4

bin x 1 1 bin x 1

daemon x 2 2 daemon x 2

lp x 4 7 lp

root x 0 0 root x 0

#显示左边文件中的所有记录,右边文件中没有匹配的显示空白。

[root@localhost tmp]# join -a2 join1 join2    #右连接

adm x 3 4 adm x 4

bin x 1 1 bin x 1

daemon x 2 2 daemon x 2

root x 0 0 root x 0

sys x 3

#显示右边文件中的所有记录,左边文件中没有匹配的显示空白。

[root@localhost tmp]# join -a1 -a2 join1 join2     #全连接

adm x 3 4 adm x 4

bin x 1 1 bin x 1

daemon x 2 2 daemon x 2

lp x 4 7 lp

root x 0 0 root x 0

sys x 3

[root@localhost tmp]# join join1 join2

adm x 3 4 adm x 4

bin x 1 1 bin x 1

daemon x 2 2 daemon x 2

root x 0 0 root x 0

[root@localhost tmp]# join -o 1.1 1.2 1.3 join1 join2

adm x 3       #只输出指定字段

bin x 1

daemon x 2

root x 0

[root@localhost tmp]# join -o 1.1 1.2 1.3 2.2 2.3 join1 join2

adm x 3 x 4     #只输出指定字段

bin x 1 x 1

daemon x 2 x 2

root x 0 x 0

(3)指定字段分隔符

[root@localhost tmp]# cat joina

adm:x:3:4:adm

bin:x:1:1:bin

daemon:x:2:2:daemon

lp:x:4:7:lp

root:x:0:0:root

[root@localhost tmp]# cat joinb

adm:x:4:

bin:x:1:

daemon:x:2:

root:x:0:

sys:x:3:

[root@localhost tmp]# join -t ":" joina joinb

adm:x:3:4:adm:x:4:

bin:x:1:1:bin:x:1:

daemon:x:2:2:daemon:x:2:

root:x:0:0:root:x:0:

(4)指定连接字段

[root@localhost tmp]# sort -t ":" -k 3 joina >join1

[root@localhost tmp]# sort -t ":" -k 3 joinb >join2

#需要先对连接字段排序

[root@localhost tmp]# cat join1

root:x:0:0:root    

bin:x:1:1:bin

daemon:x:2:2:daemon

adm:x:3:4:adm

lp:x:4:7:lp

[root@localhost tmp]# cat join2

root:x:0:

bin:x:1:

daemon:x:2:

sys:x:3:

adm:x:4:

[root@localhost tmp]# join -t ":" -j 3 join1 join2

0:root:x:0:root:root:x:       #指定同一字段连接

1:bin:x:1:bin:bin:x:

2:daemon:x:2:daemon:daemon:x:

3:adm:x:4:adm:sys:x:

4:lp:x:7:lp:adm:x:

[root@localhost tmp]# join -t ":" -1 4 -2 3 join1 join2

0:root:x:0:root:root:x:    #第一个文件的第4个字段

1:bin:x:1:bin:bin:x:        #与第二个文件的第3个字段连接

2:daemon:x:2:daemon:daemon:x:

4:adm:x:3:adm:adm:x:

(5)字符串占位

[root@localhost tmp]# join -t ":" -o 1.1 1.2  2.2 2.3 -e "aa" -a1 join1 join2

adm:x:x:4

bin:x:x:1

daemon:x:x:2

lp:x:aa:aa

root:x:x:0

本章同步视频:https://edu.51cto.com/sd/e4874