Linux连接命令join
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对文件进行连接之前最好先对需要处理的文件排序,否则有些比对的数据会被略过。
本文转载自:迹忆客(https://www.jiyik.com)
以上是 Linux连接命令join 的全部内容, 来源链接: utcz.com/z/290121.html