Shell中的join用法

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

 

发布了150 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43309149/article/details/104361144