我有两个要基于第一列和第二列合并/合并的文件。下面是所需的输出,我正在寻找。我想强调一件事,我想合并这两个文件,而不仅仅是交集。任何帮助将不胜感激!
$ 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
答案 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
的回答的扩展。