【问题标题】:Join 2 files by 2 columns, keeping all records using awk按 2 列连接 2 个文件,使用 awk 保留所有记录
【发布时间】:2014-05-29 23:34:10
【问题描述】:

我有 2 个文件需要基于 2 列进行合并。我尝试使用 awk 并尝试使用 _ 组合两列,然后使用 join 命令。使用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 的新手!

【问题讨论】:

    标签: unix join awk


    【解决方案1】:
    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,如果需要也可以对其进行排序

    【讨论】:

    • +1:谢谢肯特。我错过了从第一个文件中看到的条目。我删除了我的答案,因为它会与您的相似,也感谢您关注我。欣赏它! :)
    • 谢谢!这是完美的,是的,只需要对其进行排序并使其看起来很漂亮,但这是一个巨大的帮助,我自己永远也做不到那么远。我了解大部分代码,但是 (a[k]?a[k]:a[k]*1) 是做什么的?我想为未来变得更好,因为我正在处理未来几年更大的文件,至少在攻读博士学位!再次感谢您的帮助。
    • @slarmer1 这仅用于处理标题行。如果您可以跳过标题行,则可以将该部分缩短为 (a[k]*1) 这将空值(也是 SNP# 之类的文本)值转换为 0
    • 我正在尝试在一组我认为格式相同的新文件上使用相同的代码,但是,当它找到匹配项时,它会在下一行打印匹配的 SNP 编号> 所以它打印例如 1 12 1 (下一行) 3
    • 对此的任何帮助将不胜感激
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多