我需要在两个字段中join两个文件。 不过,我应该检索文件1中的所有值,即使连接失败,像一个左外连接。
文件1:
01|a|jack|d 02|b|ron|c 03|d|tom|e
文件2:
01|a|nemesis|f 02|b|brave|d 04|d|gorr|h
输出:
01|a|jack|d|nemesis|f 02|b|ron|c|brave|d 03|d|tom|e||
这是join -t '|' file1 file2 -a1
join -t '|' file1 file2 -a1
使用的选项:
t – >分隔符
a – >确定不成对的行必须打印的文件编号。
join -t '|' file1 file2 -a2
join -t '|' file1 file2 -a2
会做一个正确的外部连接
示例运行
[aman@aman test]$ cat f1 01|a|jack|d 02|b|ron|c 03|d|tom|e [aman@aman test]$ cat f2 01|a|nemesis|f 02|b|brave|d 04|d|gorr|h [aman@aman test]$ join -t '|' f1 f2 -a1 01|a|jack|d|a|nemesis|f 02|b|ron|c|b|brave|d 03|d|tom|e
要做的事情问题是比以前的答案有点复杂,并需要这样的事情:
sed 's/|/:/2' file1 | sort -t: >file1.tmp sed 's/|/:/2' file2 | sort -t: >file2.tmp join -t':' file1.tmp file2.tmp -a1 -e'|' -o'0,1.2,2.2' | tr ':' '|'
Unix连接只能加入单个字段AFAIK,因此必须使用使用不同分隔符的文件“在两个字段上连接两个文件 ”,在本例中为前两个字段。 我将使用冒号:但是,如果:在任何输入中都存在需要使用其他内容的情况,例如制表符可能是生产使用的更好选择。 我也重新排序新的复合字段sort -t:
的输出,这对于示例输入文件没有什么区别,但是对于真实世界的数据。 sed 's/|/:/2'
用文件中每一行的冒号代替管道的第二次出现。
file1.tmp
01|a:jack|d 02|b:ron|c 03|d:tom|e
file2.tmp
01|a:nemesis|f 02|b:brave|d 04|d:gorr|h
现在我们使用由tr
过滤的join
输出和更高级的选项:
-t':'
指定临时冒号分隔符 -a1
左外连接 -e'|'
指定失败连接的替换字符串,基本上是最终输出定界符N-1次,其中N是在file2.tmp中冒号右侧连接的管道分隔字段的数目。 在这种情况下,N = 2是一个管道字符。 -o'0,1.2,2.2'
指定输出格式:
0
连接字段 1.2
file1.tmp的字段2,即冒号的所有内容 2.2
file2.tmp的字段2 tr ':' '|'
最后,我们将冒号转换回管道进行最终输出。 输出现在匹配问题示例输出正是前一个答案没有做的:
01|a|jack|d|nemesis|f 02|b|ron|c|brave|d 03|d|tom|e||