Linux join命令

Linux 命令大全

在我们程序开发中经常看到join,不管是java,python,js 都能看到join这个函数。

那在linux中join命令做什么用的呢?

join功能说明:将两个文件中,指定栏位内容相同的行连接起来,并加以合并,再输出到标准输出设备。 

语  法:join [-i][-a<1或2>][-e<字符串>][-o<格式>] [-t<字符>][-v<1或2>][-1<栏位>][-2<栏位>][--help] [--version][文件1][文件2] 

参  数:    
    -a<1或2>   除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。

    -e<字符串>   若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串。

    -i或--igore-case   比较栏位内容时,忽略大小写的差异。 

    -o<格式>   按照指定的格式来显示结果。 

    -t<字符>   使用栏位的分隔字符。 

    -v<1或2>   跟-a相同,但是只显示文件中没有相同栏位的行。

    -1<栏位>   连接[文件1]指定的栏位。 

    -2<栏位>   连接[文件2]指定的栏位。 

    --help   显示帮助。 

    --version   显示版本信息。

在执行join命令之前我们准备两个测试文件分别为test1.txt和test2.txt

我们通过linux中的ls命令查看是否准备好了测试文件:

[root@iz8vbbxoyfcgyzkxcspg04z mnt]# ls
test1.txt  test2.txt

接着再通过cat命令分别查看test1.txt和test2.txt的文件内容:

[root@iz8vbbxoyfcgyzkxcspg04z mnt]# cat test1.txt 
1 一
2 二
3 三
4 四
5 五
6 六
7 七 #第二文件没有
[root@iz8vbbxoyfcgyzkxcspg04z mnt]# cat test2.txt 
1 one
2 two
3 three
4 four
5 five
6 six
8 eight #第一个文件没有

这两个文件的内容我们已经清楚了,现在我们准备使用 join 命令,连接一下试试。

[root@iz8vbbxoyfcgyzkxcspg04z mnt]# join test1.txt test2.txt 
1 一 one
2 二 two
3 三 three
4 四 four
5 五 five
6 六 six

通过实验我们得到一个重要的结论:

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

join -a1 左连接(又称左外连接,显示左边所有记录)

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

[root@iz8vbbxoyfcgyzkxcspg04z mnt]# join -a1 test1.txt test2.txt 
1 一 one
2 二 two
3 三 three
4 四 four
5 五 five
6 六 six
7 七 #第二文件没有

join -a2 右连接(又称右外连接,显示右边所有记录)

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

[root@iz8vbbxoyfcgyzkxcspg04z mnt]# join -a2 test1.txt test2.txt 
1 一 one
2 二 two
3 三 three
4 四 four
5 五 five
6 六 six
8 eight #第一个文件没有

join 有左连接 和 右连接 能实现全连接吗?

join -a1 -a2 全连接(又称全外连接,显示左边和右边合并后的所有记录)

[root@iz8vbbxoyfcgyzkxcspg04z mnt]# join -a1 -a2 test1.txt test2.txt 
1 一 one
2 二 two
3 三 three
4 四 four
5 五 five
6 六 six
7 七 #第二文件没有
8 eight #第一个文件没有

join -e<字符串>   若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串。

为了测试-e参数,我们通过vim再创建一个文件为test3.txt,去掉 "three",通过cat查看一下创建的内容:

[root@iz8vbbxoyfcgyzkxcspg04z mnt]# cat test3.txt 
1 one
2 two
3 
4 four
5 five
6 six
8 eight #第一个文件没有

现在我们准备通过join 带 -e 参数,实现填补空缺,命令如下:

[root@iz8vbbxoyfcgyzkxcspg04z mnt]# join -eaaa test1.txt test3.txt
1 一 one
2 二 two
3 三 aaa  #-e后面跟着aaa,所以此处填补了aaa
4 四 four
5 五 five
6 六 six

join -o<格式>   按照指定的格式来显示结果

在做这个参数测试之前,我们先来了解一下格式结构,会更好的理解代码。

指定输出字段:
-o <FILENO.FIELDNO> ...
其中FILENO=1表示第一个文件,FILENO=2表示第二个文件,FIELDNO表示字段序号,从1开始编号。默认会全部输出,但关键字列只输出一次。
比如:-o 1.1 1.2 2.2 表示输出第一个文件的第一个字段、第二个字段,第二个文件的第二个字段。

-o 参数 代码示例如下:

[root@iz8vbbxoyfcgyzkxcspg04z mnt]# join -o 1.1 2.2 test1.txt test2.txt
1 one
2 two
3 three
4 four
5 five
6 six

解释说明:连接第一个文件的第一个字段和第二个文件的第二个字段

[root@iz8vbbxoyfcgyzkxcspg04z mnt]# join -o 1.1 2.2 1.2 test1.txt test2.txt
1 one 一
2 two 二
3 three 三
4 four 四
5 five 五
6 six 六

join -t<字符>   使用栏位的分隔字符

本实例中测试的内容是空格' ',所以用空格' '来进行分隔,命令如下:

[root@iz8vbbxoyfcgyzkxcspg04z mnt]# join -t ' ' test1.txt test2.txt
1 一 one
2 二 two
3 三 three
4 四 four
5 五 five
6 六 six

join -v<1或2>   跟-a相同,但是只显示文件中没有相同栏位的行

[root@iz8vbbxoyfcgyzkxcspg04z mnt]# join -v1 test1.txt test2.txt
7 七 #第二文件没有
[root@iz8vbbxoyfcgyzkxcspg04z mnt]# join -v2 test1.txt test2.txt
8 eight #第一个文件没有

Linux 命令大全