迹忆博客
当前位置: 主页 > 学无止境 > 操作系统 > 文章

Linux连接命令join

发布时间: 2016-09-30 作者: 迹忆 浏览次数:

join命令同样也是管道命令家族中的一员,它的作用是将每个文件中栏位(也就是第一列)相等的那些行的数据连接起来。

首先我们准备两个文件 /tmp/join1和/tmp/join2。

# cat /tmp/join1
www onmpw
domain jiyi
w3 blog
join command
ls l
# cat /tmp/join2
www com
domain cn
w3 net
Join org
wc l

准备好上面两个文件以后,我们先来看一看没有选项的join的用法。

# join /tmp/join1 /tmp/join2
www onmpw com
domain jiyi cn
w3 blog net

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

这里我们可能注意到了一个地方,在join1文件中有join,而在join2中该行的第一列是Join。这应该怎么匹配呢?join默认是区分大小写的,所以二者看作是不相等的。要想使二者相等那我们就需要使用join的-i选项来实现。

-i 忽略大小写

# join /tmp/join1 /tmp/join2
www onmpw com
domain jiyi cn
w3 blog net
join command org

我们看,是不是多了一行。

-a FILENUM 在正常结果后面打印FILENUM那个文件的未被连接的行。

# join –a 2 /tmp/join1 /tmp/join2
www onmpw com
domain jiyi cn
w3 blog net
Join org
wc l
# join –a 1 /tmp/join1 /tmp/join2
www onmpw com
domain jiyi cn
w3 blog net
join command
ls l

看到上面的结果应该就能理解-a选项的含义了。在/tmp/join1 中 join command 和 ls l未被连接,所以-a 指定1的时候这两者被打印出来,同理-a指定2的时候 Join org 和 wc l 被打印出来。

-v FILENUM 该选项和-a功能相近,唯一不同的是-v不会输出连接的行,只输出指定文件中没有连接的行。

# join –v 1 /tmp/join1 /tmp/join2
join command
ls l
# join –v 2 /tmp/join1 /tmp/join2
Join org
wc l

-t 指定分隔符,默认情况下我们所说的栏位是以空格符分割出来的字段。通过该选项我们可以改变其栏位

# cat /tmp/join3
domain:cs
www:com
domain:cn
w3:net
Join:org
wc:l
# cat /tmp/join4
www:onmpw
domain:jiyi
w3:blog
join:command
ls:l

我们先看默认使用空格分割

# join /tmp/join3 /tmp/join4
//结果为空,因为每一列都不相等

接下来使用-t指定分隔符

# join –t : /tmp/join3 /tmp/join4
www:com:onmpw
domain:cn:jiyi
w3:net:blog

我们看是不是有结果了。没错,这就是-t的用法。

-o 指定需要连接的栏位。这是什么意思呢,默认的情况下连接的时候是第一位就是两个文件相同的栏位,然后就是按照 file1 file2的顺序依次连接两个文件的内容。使用该选项是指定我们想要连接的栏位,而不是所有的栏位都去连接。

它的格式如下

-o M.N,M.N

这里的M表示的是第几个文件,N表示的是连接第N个栏位。

-o 1.2,2.2

这个例子表示将文件1的第二个栏位和文件2的第二个栏位连接起来,当然前提是二者达到了连接的条件。

# join /tmp/join1 /tmp/join2  //先看默认情况
www onmpw com
domain jiyi cn
w3 blog net

我们看输出的结果是先是相同的栏位,然后依次是join1 再就是join2。

# join –o 1.1,2.2 /tmp/join1 /tmp/join2
www com
domain cn
w3 net

看我们指定连接栏位显示的结果。

# join –o 1.2,2.2 /tmp/join1 /tmp/join2
onmpw com
jiyi cn
blog net

指定第一个文件的第二个栏位和第二个文件的第二个栏位连接显示。现在应该明白-o的用法了吧!

-1 FIELD 指定用来比较的第一个文件的栏位

-2 FIELD 指定用来比较的第二个文件的栏位

我们知道,默认情况下用来进行比较的是两个文件的第一个栏位。使用上面的选项可以改变比较的栏位。

# cat /tmp/join5
onmpw www
jiyi domain
blog w3
command join
l ls

先看默认情况下join5和join2连接的结果

# join /tmp/join5 /tmp/join2
//结果为空

出现空结果的原因是join5文件的第一个栏位和join2文件的第一个栏位都不相等,所以没有可以连接的行。

# join -1 2 /tmp/join5 /tmp/join2
www onmpw com
domain jiyi cn
w3 blog net

我们指定了使用第一个文件,也就是join5文件,的第二个栏位和join2文件的第一个栏位比较就出现了结果,因为这两个栏位有相等的字符串。

明白了上面的例子,-1 FIELD和-2 FIELD 合用的情况也就不难理解了

# join -1 2 -2 2 /tmp/join5 /tmp/join2
//结果为空

-j FIELD 该选项的用法相当于 -1 FIELD -2 FIELD。这里就不再举例了。

关于join命令的具体用法我们就介绍到这。最后需要说明一下,在使用join对文件进行连接之前最好先对需要处理的文件排序,否则有些比对的数据会被略过。

除非注明转载,本站文章均为原创,欢迎转载,转载请以链接形式注明出处

本文地址: