Skip to content

Latest commit

 

History

History
216 lines (149 loc) · 3.94 KB

201511251336.txt.md

File metadata and controls

216 lines (149 loc) · 3.94 KB

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

-2 fieldnumber