在unix中的两个文件上留下外连接

我需要在两个字段中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||