Shell中的join用法
将两个文件里指定栏位置同样的行连接起来,
即依照两个文件中共同拥有的某一列,
将相应的行拼成一行(原文件不改变)
内连接(忽略不匹配的行) join file1 file2
显示左边文件中所有记录,右边文件中没有匹配的显示空白
join -a1 file1 file2
显示右边文件中所有记录,左边文件中没有匹配的显示空白
join -a2 file1 file2
全连接(又称全外连接,显示左边和右边所有记录)
join -a1 -a2 file1 file2
指定输出字段
join -o 1.1 file1 file2表示只输出第一个文件的第一个字段
指定输出多个字段
输出第一个文件的第一个字段,输出第二个文件的第二个字段
join - o 1.1 2.2 1.2 file1 file2
指定分隔符
join -t ‘:’ /etc/passwd /etc/shadow
不匹配输出
Join -v 1 -a1 -a2 file1 file2
-v FILENUM:与-a相似,但只显示文件里没有匹配的行
FILENUM : 区分左边还是右边的文件
[root@localhost join]# cat join1
www onmpw
domain jiyi
w3 blog
[root@localhost join]# cat join2
www com
domain cn
w3 net
Join org
wc l
[root@localhost join]# join join1 join2
www onmpw com
domain jiyi cn
w3 blog net
join: join2:6: is not sorted:
[root@localhost join]#
join -t : file.db file_hobby.db #-t 指定分隔符,拼接列相等的行
[root@localhost join]# 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@localhost join]# cat file_hobby.db
A li:Song
B wang:shopping
C zhang:pingpong
D liu:chess
E wang:reading
[root@localhost join]# 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
join内拼接(都是基于join file1 file2的结果)
[root@localhost join]# vim file1
[root@localhost join]# seq 1 1 14 > file1
[root@localhost join]# vim file1
[root@localhost join]# seq 1 1 13 > file2
[root@localhost join]# ls
file1 file2 file.db file_hobby.db join1 join2
[root@localhost join]# cat file1
1 Jan
2 Feb
……
9 Sep
10 Oct
11 Nov
12 Dec
13 MonthUnknow
[root@localhost join]# cat file2
1 一月
2 二月
……
9 九月
10 十月
11 十一月
12 十二月
[root@localhost join]# join file1 file2
1 Jan 一月
2 Feb 二月
……
9 Sep 九月
10 Oct 十月
11 Nov 十一月
12 Dec 十二月
-a2显示右边文件中的所有记录,左边文件中没有匹配的显示空白
左:第一个 右:第二个
[root@localhost join]# join -a2 file2 file1
1 一月 Jan
2 二月 Feb
……
9 九月 Sep
10 十月 Oct
11 十一月 Nov
12 十二月 Dec
13 MonthUnknow
-a1显示左边文件中的所有记录,右边文件中没有匹配的显示空白
[root@localhost join]# join -a1 file2 file1
1 一月 Jan
2 二月 Feb
……
9 九月 Sep
10 十月 Oct
11 十一月 Nov
12 十二月 Dec
-a1 -a2 显示全外连接,显示左边和右边的所有结果
[root@localhost join]# join -a1 -a2 file2 file1
1 一月 Jan
2 二月 Feb
……
9 九月 Sep
10 十月 Oct
11 十一月 Nov
12 十二月 Dec
13 MonthUnknow
以下操作基于join file1 file2的结果
-o a.b 指定文件的字符join file1 file2处理结果后取第a个文件
(默认以空格为分隔符)的第一个字段
[root@localhost join]# join file1 file2
1 Jan 一月
2 Feb 二月
……
9 Sep 九月
10 Oct 十月
11 Nov 十一月
12 Dec 十二月
[root@localhost join]# join -o 1.1 file1 file2
1
2
……
9
10
11
12
[root@localhost join]# cat file1
1 Jan
2 Feb
……
9 Sep
10 Oct
11 Nov
12 Dec
13 MonthUnknow
输出join处理后的第一个文件的第一个字段 第二个文件的第二个字段
[root@localhost join]# join -o 1.1 2.2 file1 file2
1 一月
2 二月
……
9 九月
10 十月
11 十一月
12 十二月
输出join处理后的第一个文件的第一个字段
和第二个文件的第二个字段 和第一个文件的第二个字段
[root@localhost join]# join -o 1.1 2.2 1.2 file1 file2
1 一月 Jan
2 二月 Feb
……
9 九月 Sep
10 十月 Oct
11 十一月 Nov
12 十二月 Dec
[root@localhost join]# join -o 1.1 2.2 1.1 file1 file2
1 一月 1
2 二月 2
……
9 九月 9
10 十月 10
11 十一月 11
12 十二月 12
join -t ':' file1 file2
-t 指定分隔符进行join操作,分隔符被单引号包围
[root@localhost join]# join -t ':' /etc/passwd /etc/shadow
join -v 1 -a1 -a2 file1 file2 输出不匹配的行输出
[root@localhost join]# join -v 1 -a1 -a2 file1 file2
13 MonthUnknow