14.4 join命令
http://scz.617.cn/unix/201511251336.txt
A: scz 2015-11-25 13:36
下面是Debian 8.0上的join(1):
NAME
基于common field(identical join field)连接两个文件
$ cat 1.txt
1 111
2 222
3 333
$ cat 2.txt
1 aaa
3 ccc
4 ddd
$ cat 3.txt
ddd:444
Aaa:111
eeE:333
$ cat 4.txt
ddd:DDD
aaa:AAA
eee:EEE
$ join 1.txt 2.txt
1 111 aaa
3 333 ccc
SYNOPSIS
join [OPTION]... FILE1 FILE2
DESCRIPTION
缺省join field是first field,以空格为分隔符。FILE1、FILE2可以是-,表示
标准输入(stdin)。
应该针对FILE1、FILE2的join field排序,比如:
$ sort -k 1b,1 3.txt
$ sort -k 1b,1 4.txt
1b,1表示[1,1]对应的field为key,b表示忽略打头空格。参看sort(1)。
-a FILENUM
FILENUM可为1或2,分别对应FILE1、FILE2。指定"-a n"时,如果FILEn中某行在
另一个文件中没有匹配行,仍将显示FILEn中该行。
$ join -a 1 1.txt 2.txt
1 111 aaa
2 222
3 333 ccc
$ join -a 2 1.txt 2.txt
1 111 aaa
3 333 ccc
4 ddd
$ join -a 1 -a 2 1.txt 2.txt
1 111 aaa
2 222
3 333 ccc
4 ddd
-e EMPTY
与-o、-a一起使用才会生效。缺失的field一般显示以空串,但可以用-e指定别
的串。
$ join -o 1.2 2.2 -a 1 -a 2 1.txt 2.txt
111 aaa
222
333 ccc
ddd
$ join -o 1.2 2.2 -a 1 -a 2 -e xxx 1.txt 2.txt
111 aaa
222 xxx
333 ccc
xxx ddd
-i, --ignore-case
对join field忽略大小写之后进行比较
$ join -t : 3.txt 4.txt
ddd:444:DDD
$ join -t : -i 3.txt 4.txt
ddd:444:DDD
Aaa:111:AAA
eeE:333:EEE
-j FIELD
等价于"-1 FIELD -2 FIELD"
-o FORMAT
指定输出哪些field。格式为n.m,表示FILEn的FIELDm,m从1计。可以指定多个
n.m,以空格或逗号分隔。FORMAT为0,表示join field。
缺省FORMAT先输出join field,接着输出FILE1中剩余field,最后输出FILE2中
剩余field。
如果FORMAT为auto,则每个文件的第一行决定该文件每行输出多少个field。
$ join -o 0 1.txt 2.txt
1
3
$ join -o 0,1.2,2.2 1.txt 2.txt
1 111 aaa
3 333 ccc
$ join -o 1.2 2.2 1.txt 2.txt
111 aaa
333 ccc
$ join -o 1.1 1.2 2.2 1.txt 2.txt
1 111 aaa
3 333 ccc
$ join -o 2.1 1.2 2.2 1.txt 2.txt
1 111 aaa
3 333 ccc
$ join -o 1.1 1.2 2.2 -a 1 -a 2 1.txt 2.txt
1 111 aaa
2 222
3 333 ccc
ddd
-t CHAR
缺省field分隔符为空格,可以用-t指定field分隔符。
除非指定-t,否则每行打头的空格被忽略。
-v FILENUM
指定"-v n"时,显示FILEn减去join结果之后的内容。
$ join -v 1 1.txt 2.txt
2 222
$ join -v 2 1.txt 2.txt
4 ddd
$ join -v 1 -v 2 1.txt 2.txt
2 222
4 ddd
-1 FIELD
为FILE1指定join field
-2 FIELD
为FILE2指定join field
--check-order
check that the input is correctly sorted, even if all input lines are
pairable
$ join -t : -i --check-order 3.txt 4.txt
join: 3.txt:2: is not sorted: Aaa:111
--nocheck-order
do not check that the input is correctly sorted
--header
将FILE1、FILE2的第一行视为Field Header,直接显示,不进行比较
-z, --zero-terminated
line delimiter is NUL, not newline
--help
显示帮助信息
--version
显示版本信息
SEE ALSO
comm(1), uniq(1)
下面是x64/Solaris 10上的join(1):
-a filenumber
-e string
-j fieldnumber
-j1 fieldnumber
等价于"-1 fieldnumber"
-j2 fieldnumber
等价于"-2 fieldnumber"
-o list
-t char
-v filenumber
-1 fieldnumber