按2列加入2个文件,使用awk保留所有记录

时间:2014-04-15 14:28:23

标签: unix join awk

我需要根据2列合并2个文件。我尝试过使用awk以及尝试使用_组合2列然后使用join命令。使用连接时,即使在排序后,某些记录也不匹配,并且创建了多个记录。使用awk awk 'NR==FNR{a[$1,$2]=$3;next} ($1,$2) in a{print $0, a[$1,$2]}' file 1 file 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的新手!

1 个答案:

答案 0 :(得分:2)

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

为了获得更好的格式,您可以将结果传递给column -t,如果有必要也可以对其进行排序