14.4 join命令 https://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 --------------------------------------------------------------------------