基于共同的两个列联接两个文件

时间:2019-01-13 19:53:09

标签: linux bash awk merge

我有两个要基于第一列和第二列合并/合并的文件。下面是所需的输出,我正在寻找。我想强调一件事,我想合并这两个文件,而不仅仅是交集。任何帮助将不胜感激!

$ cat file1
2L      5753   33158
2L      8813   33158
2L      7885   33159
2L      1279   33159
2L      5095   33158
$
$ cat file2
2L      8813    0.6    1.2
2L      5762    0.4    0.5
2L      1279    0.5    0.9
$

Desired Output:
2L      5753                33158
2L      8813    0.6    1.2  33158
2L      7885                33159
2L      1279    0.5    0.9  33159
2L      5095                33158
2L      5762    0.4    0.5

我找到了类似的帖子,但似乎需要进行一些调整才能满足我的想法。网址是: Similar Stackoverflow link

2 个答案:

答案 0 :(得分:0)

使用gawk

$ gawk -F$'\t' -v OFS=$'\t' 'FNR==NR{l[$1,$2]=$0; next}  
                       l[$1,$2]{print l[$1,$2],$3; delete l[$1,$2]; next} 
                        {print $1,$2,OFS,$3}
                        END{for (e in l) if(l[e]) print l[e]}' f2 f1
2L  5753            33158
2L  8813    0.6 1.2 33158
2L  7885            33159
2L  1279    0.5 0.9 33159
2L  5095            33158
2L  5762    0.4 0.5

这假设\t分隔字段。

答案 1 :(得分:-1)

以下bash脚本从file1读取每一行,从file2(的副本)提取相应的行,合并两行,然后将结果打印到stdout。最后,打印出文件2(它的左边)。

temp=$(mktemp)
cp file2 $temp
while read col1 col2 arg3; do
  line=$(sed -r -i -e "/^$col1\ +$col2/ {w /dev/stdout" -e "d}" $temp)
  arg1=$(awk '{print $3}' <<< $line)
  arg1=${arg1:-   }
  arg2=$(awk '{print $4}' <<< $line)
  arg2=${arg2:-   }
  echo -e "$col1\t$col2\t$arg1    $arg2\t$arg3"
done < file1
cat $temp
rm $temp

sed命令的构想取自达基米安对吉勒斯对Printing and deleting the first line of a file using sed的回答的扩展。