unix - 按 2 列连接 2 个文件,使用 awk 保留所有记录

标签 unix join awk

我有 2 个文件需要根据 2 列合并。我尝试过使用 awk 并尝试使用 _ 组合两列,然后使用 join 命令。使用join时,即使排序后,某些记录仍不匹配,并且创建了多条记录。在 a{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

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

关于unix - 按 2 列连接 2 个文件,使用 awk 保留所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23086675/

相关文章:

unix - 使用 awk 删除重复项时忽略大小写

c - 在 Unix 中崩溃时自动释放互斥锁

python - 如何有条件地将 pandas 系列 append 到另一个数据框

linux - 显示当前解释器有多少个子进程的命令

awk - 从文本文件中删除 ^M

regex - 用注释替换字符串的特定出现

bash - 用sed批量删除多个文件中的多行

mysql - 如何比较 2 个不同表中的行 : mySQL - what's different

mysql - 加入空表时出现问题

linux - 使用 sed,行切割提取 sql 插入