Unix 通过2列连接2个文件,使用awk保留所有记录

Unix 通过2列连接2个文件,使用awk保留所有记录,unix,join,awk,Unix,Join,Awk,我有2个文件需要根据2列合并。我尝试过使用awk,也尝试过使用u组合两列,然后使用join命令。使用join时,某些记录甚至在排序后也不匹配,因此创建了多个记录。在{print$0,a[$1,$2]}文件1文件2中使用awkawk'NR==FNR{a[$1,$2]=$3;next}($1,$2) 我可以正确地匹配文件,但当不存在匹配项时,无法使用零打印输出 文件1: chr pos SNP# 1 124 1 1 237 2 1 356 3 2

我有2个文件需要根据2列合并。我尝试过使用awk,也尝试过使用u组合两列,然后使用join命令。使用join时,某些记录甚至在排序后也不匹配,因此创建了多个记录。在{print$0,a[$1,$2]}文件1文件2中使用awk
awk'NR==FNR{a[$1,$2]=$3;next}($1,$2)
我可以正确地匹配文件,但当不存在匹配项时,无法使用零打印输出

文件1:

chr   pos   SNP#
1     124   1
1     237   2
1     356   3  
2     107   4
2     224   5
文件2:

chr   pos   SNPHD
1     12    1
1     56    2
1     124   3
1     160   4
1     237   5
1     256   6  
1     354   7
2     107   8
2     185   9
2     224   10
期望输出:

chr   pos   SNP#   SNPHD
1     12    0      1
1     56    0      2
1     124   1      3
1     160   0      4
1     237   2      5
1     256   0      6
1     354   0      7
1     356   3      0
2     107   4      8
2     185   0      9
2     224   5      10
任何帮助都将不胜感激,我对大数据文件和unix是新手

awk 'NR==FNR{a[$1FS$2]=$3;next}
    {k=$1FS$2;print k,(a[k]?a[k]:a[k]*1),$3;delete a[k]}
     END{for(k in a)print k,a[k],"0"}' f1 f2
结果未排序:

chr pos SNP# SNPHD
1 12 0 1
1 56 0 2
1 124 1 3
1 160 0 4
1 237 2 5
1 256 0 6
1 354 0 7
2 107 4 8
2 185 0 9
2 224 5 10
1 356 3 0

为了获得更好的格式,您可以通过管道将结果传输到
列-t
,必要时也可以对其进行排序

+1:谢谢Kent。我没有看到第一个文件中的条目。我删除了我的答案,因为它会被证明是类似于你的,也谢谢你照顾我。谢谢你<代码>:)
谢谢!这是完美的,是的,只需要对它进行分类,使它看起来漂亮,但这是一个巨大的帮助,我自己永远不会走那么远。我理解大部分代码,但是(a[k]?a[k]:a[k]*1)在做什么?我想为未来做得更好,因为我将在接下来的几年里处理如此大的文件,至少在攻读博士学位!再次感谢您的帮助。@slarmer1这只是为了处理标题行。如果您可以跳过标题行,您可以将该部分缩短为
(a[k]*1)
将空值(以及SNP#等文本)转换为
0
我尝试在一组新文件上使用相同的代码,我认为这些文件的格式相同,但是,当它找到匹配项时,它正在下一行打印匹配的SNP编号>,因此它将打印例如1 12 1(下一行)3任何与此相关的帮助都将不胜感激