join - join lines of two files on a common field、
-a FILENUM
print unpairable lines coming from file FILENUM, where FILENUM
is 1 or 2, corresponding to FILE1 or FILE2
-e EMPTY
replace missing input fields with EMPTY
-i, --ignore-case ignore differences in case when comparing fields
-j FIELD
equivalent to ‘-1 FIELD -2 FIELD’
-o FORMAT
obey FORMAT while constructing output line
-t CHAR
use CHAR as input and output field separator
-v FILENUM
like -a FILENUM, but suppress joined output lines
-1 FIELD
join on this FIELD of file 1
-2 FIELD
join on this FIELD of file 2
join 命令与数据库中的连接有点相似。join 默认是对第一字段进行比较,分隔符是空格。
等同于-j 1 和 -1 1 -2 1 如下:
[root@PC_IN_LAN ~]#cat a
1 a 20 just
2 bb 45 for
3 cc 15 fun
[root@PC_IN_LAN ~]#cat b
1 BB 20 d
2 CC 15 c
5 DD 45 b
[root@PC_IN_LAN ~]#join a b(默认比较第一个文件的第一个域与第二个文件的第一个域 相等则合并)
1 a 20 just BB 20 d
2 bb 45 for CC 15 c
[root@PC_IN_LAN ~]#join -j 1 a b
1 a 20 just BB 20 d
2 bb 45 for CC 15 c
[root@PC_IN_LAN ~]#join -1 1 -2 1 a b
1 a 20 just BB 20 d
2 bb 45 for CC 15 c
各选项的含义
-a 输出不符合匹配条件的行(有点像数据库中的外连接)
[root@PC_IN_LAN ~]#join -a 1 a b(1表示输出文件1中不符合的行等同于数据库中的左外连接)
1 a 20 just BB 20 d
2 bb 45 for CC 15 c
3 cc 15 fun
[root@PC_IN_LAN ~]#join -a 2 a b(文件2不符合的行)
1 a 20 just BB 20 d
2 bb 45 for CC 15 c
5 DD 45 b
[root@PC_IN_LAN ~]#join -a 2 -a 1 a b(文件1 文件2 不符合的行)
1 a 20 just BB 20 d
2 bb 45 for CC 15 c
3 cc 15 fun
5 DD 45 b
与-a 选项相对的是-v 选项 只输出不符合的行(用法和-a 选项一样)
[root@PC_IN_LAN ~]#cat a
1 a 20 just
2 bb 45 for
3 cc 15 fun
[root@PC_IN_LAN ~]#cat b
1 BB 20 d
2 CC 15 c
5 DD 45 b
[root@PC_IN_LAN ~]#join -v 1 a b(只输出文件1中不符合条件的行)
3 cc 15 fun
下面是-j -1 -2 选项的用法,这三个分别用来指定文件用第几个字段进行比较(man join 可知 -j 1 与
-1 1 -2 1 等同 )分别表示第一个文件的第一个字段与第二个文件的第1个字段比较。(但我不知道怎么对两个文件中的多个字段比较,比如:第一个文件中的1,2 与第二个文件的2,3进行比较,如果那位大虾看到了请赐教!)
[root@PC_IN_LAN ~]#join -j 3 a b(这里输出的结果不是预想的结果 原因是因为join之前没对文件进行比较)
20 1 a just 1 BB d
45 2 bb for 5 DD b
[root@PC_IN_LAN ~]#cat a
1 a 20 just
2 bb 45 for
3 cc 15 fun
[root@PC_IN_LAN ~]#cat b
1 BB 20 d
2 CC 15 c
5 DD 45 b
[root@PC_IN_LAN ~]#sort -n -k 3 a -o a
[root@PC_IN_LAN ~]#sort -n -k 3 b -o b
[root@PC_IN_LAN ~]#join -j 3 a b(排序后对文件join就没问题了)
15 3 cc fun 2 CC c
20 1 a just 1 BB d
45 2 bb for 5 DD b
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-o 输出连接后你想要得到的字段(指定输出字段)
[root@PC_IN_LAN ~]#join -j 3 -o 1.4 2.4 a b
fun c
just d
for b
上面分别输出的是连接后第一个文件的第四个字段和第二个文件的第二个字段
-t 指定文件中的分隔符
-i 忽略大小写
阅读(3797) | 评论(1) | 转发(0) |