Unix在两个文件上join多个字段

我有两个文件

猫test1.txt

1|2|3|4 2|3|4|4 3|4|5|5 

猫test2.txt

 1|2|4|5 2|3|5|6 3|5|7|7 

我的输出应该是

 1|2|3|4|4|5 2|3|4|4|5|6 

它就像在字段1和2上join两个文件一样,从文件1和文件2中得到1,2,3,4的值。

请在这件事上给予我帮助?

 awk -F\| 'NR == FNR { f2[$1, $2] = $3 OFS $4 next } ($1, $2) in f2 { print $0, f2[$1, $2] }' OFS=\| test2.txt test1.txt 

嗯,这适用于你的例子:

  sed 's/|/+/' t1.txt>$$.tmp;sed 's/|/+/' t2.txt|join -t \| -j 1 $$.tmp -|sed 's/+/|/';rm $$.tmp 

这也似乎工作:

 $ sed 's/|/\t/2' 1.txt > 1_1.txt; sed 's/|/\t/2' 2.txt > 2_1.txt; $ join -j1 1_1.txt 2_1.txt | tr ' ' '|' $ rm 1_1.txt 2_1.txt 

没有临时文件创建的单行程(感谢@ dbaupp):

 $ join -j1 <(sed 's/|/\t/2' 1.txt) <(sed 's/|/\t/2' 2.txt) | tr ' ' '|' 

尝试在perl这样做

 paste -d '|' file1.txt file2.txt | perl -F'\|' -lane ' print join "|", @F[0..3,6,7] if $F[0] eq $F[4] and $F[1] eq $F[5] ' 

而在sh

 #!/bin/sh paste -d '|' test1.txt test2.txt | while IFS='|' read a1 a2 a3 a4 a5 a6 a7 a8; do if [ $a1 -eq $a5 -a $a2 -eq $a6 ]; then echo "$a1|$a2|$a3|$a4|$a7|$a8" fi done 

OUTPUT

 1|2|3|4|4|5 2|3|4|4|5|6 

另一个方案

 awk -F "|" '{getline a < "file1"}NR==1{print a, $3, $4 "\n"}NR==3{print a, $3, $4}' OFS="|" file2 

结果:

 $ awk -F "|" '{getline a < "file1"}NR==1{print a, $3, $4 "\n"}NR==3{print a, $3, $4}' OFS="|" file2 1|2|3|4|4|5 2|3|4|4|5|6