Shell常用命令-- join 详解

无人久伴 提交于 2020-02-14 19:51:32

一、join命令

**命令功能:**将两个文件里指定栏位同样的行连接起来,即依照两个文件里共有的某一列,将相应的行拼接成一行。

用法:

join [options] file1 file2

注:

  • 这两个文件必须已经在此列上是依照同样的规则进行了排序
  • join默认是区分大小写的

二、常见用法

示例1:

[root@server1 ~]# cat join1 
www onmpw
domain jiyi
w3 blog
join command
ls l
[root@server1 ~]# cat join2
www com
domain cn
w3 net
Join org
wc l
[root@server1 ~]# join join1 join2
www onmpw com
domain jiyi cn
w3 blog net

在join1 和join2文件中前三行的第一列的数据相等,因此会将这三行数据拼接。对于其他两行因为第一列字符串并不相等,所以也就不会拼接了

将两个文件的具有共同域的纪录连接在一起:

示例2:指定的分隔符

加参数-t可以指定分隔符

[root@server1 ~]# join -t : file.db file_hobby.db
A li:20:men:anhui:Song
B wang:21:women:jiangsu:shopping
C zhang:22:men:anhui:pingpong
D liu:23:women:Shanghai:chess
[root@server1 ~]# cat file.db 
A li:20:men:anhui
B wang:21:women:jiangsu
C zhang:22:men:anhui
D liu:23:women:Shanghai
E chen:23:women:Hefei
[root@server1 ~]# cat file_hobby.db 
A li:Song
B wang:shopping
C zhang:pingpong
D liu:chess
E Wang:reading

示例3:内连接(忽略不匹配的行)

这种情况是默认的情况

[root@server1 ~]# join file1 file2
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
[root@server1 ~]# cat file1
1 一月
2 二月
3 三月
4 四月
5 五月
6 六月
7 七月
8 八月
9 九月
10 十月
11 十一月
12 十二月
13 十三月
[root@server1 ~]# cat file2
1 January
2 February
3 March
4 April
5 May
6 June
7 July
8 August
9 September
10 October
11 November
12 December
14 MonthUnknown

示例4:显示左边文件中的所有记录,右边文件中没有匹配的显示空白

[root@server1 ~]# join -a1 file1 file2
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
13 十三月

示例5:显示右边文件中的所有记录,左边文件中没有匹配的显示空白

[root@server1 ~]# join -a2 file1 file2
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
14 MonthUnknown

示例6:全连接(又称全外连接,显示左边和右边所有记录)

[root@server1 ~]# join -a1 -a2 file1 file2
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
13 十三月
14 MonthUnknown

示例7: 指定输出字段

-o 1.1 表示只输出第一个文件的第一个字段

[root@server1 ~]# join -o 1.1 file1 file2
1
2
3
4
5
6
7
8
9
10
11
12

示例8:指定输出多个字段
输出第一个文件的第一个字段,输出第二个文件第二个字段

[root@server1 ~]# join -o 1.1 2.2 file1 file2
1 January
2 February
3 March
4 April
5 May
6 June
7 July
8 August
9 September
10 October
11 November
12 December

示例9:输出第一个文件的第一个字段和第二个字段,输出第二个文件第二个字段

[root@server1 ~]# join -o 1.1 2.2 1.2 file1 file2
1 January 一月
2 February 二月
3 March 三月
4 April 四月
5 May 五月
6 June 六月
7 July 七月
8 August 八月
9 September 九月
10 October 十月
11 November 十一月
12 December 十二月

示例10: 第一个文件第三个字段不存在的情况

[root@server1 ~]# join -o 1.1 1.2 1.3 2.2 file1 file2
1 一月  January
2 二月  February
3 三月  March
4 四月  April
5 五月  May
6 六月  June
7 七月  July
8 八月  August
9 九月  September
10 十月  October
11 十一月  November
12 十二月  December
[root@server1 ~]# join -o 1.1 1.2 2.2 file1 file2
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December

示例11: 指定分隔符整合文件

[root@server1 ~]# join -t ':' /etc/passwd /etc/shadow
root:x:0:0:root:/root:/bin/bash:$6$pTycYIIhMhGpyE5d$FhiVzaqbtD8DKsTyxsEUZ.zr1IUeFfbMqEZP7utQFYRwkb6VOwJ974cou2QbRHT0d.oQwhCSYxK4uEZk/pfMQ/::0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:17492:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:17492:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin:*:17492:0:99999:7:::
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin:*:17492:0:99999:7:::
sync:x:5:0:sync:/sbin:/bin/sync:*:17492:0:99999:7:::

示例12: 不匹配的行输出

[root@server1 ~]# join -v 1 -a1 -a2  file1 file2
13 十三月
14 MonthUnknown
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!