Bash “加入”两列

Bash “加入”两列

我有两个文件:

1_file.txt:
ChrX 129759713 A G
ChrX 129760010 C T
ChrX 129762238 C G
ChrX 129762448 A G
ChrX 129762803 A C
ChrX 129763441 C A
ChrX 129764931 T C
ChrX 129767696 C T
ChrX 129818213 C T
ChrX 129841336 T C

2_files.txt:
Chr29 129841336 T C
Chr29 129845233 A G
Chr29 129852688 T C
Chr29 129871602 G T
Chr29 129872683 T C
ChrX 129875545 C A
ChrX 129876975 A G
ChrX 129879796 G A
ChrX 129880521 T C
ChrX 129759713 A G
ChrX 129760010 C T
ChrX 129762238 C G
ChrX 129762448 A G
ChrX 129762803 A C
ChrX 129763441 C A

我想将两个文件按字段一和二合并为一个

The answer
ChrX 129759713 A G
ChrX 129760010 C T
ChrX 129762238 C G
ChrX 129762448 A G
ChrX 129762803 A C
ChrX 129763441 C A

有什么想法如何使用 join 或 awk 来做到这一点?

答案1

第二个文件中是否缺少行?我没有看到带有“TG”或“AT”的。据我所知,join不接受两个字段,您只需使用 sed 连接两个字段即可。这是您的具体示例的示例:

join -j 1 <(cat 1_file.txt | sed "s/ /_/") <(cat 2_files.txt | sed "s/ /_/")

答案2

通过 awk,您可以使用

awk '
    NR == FNR          {f1[$1,$2] = $0; next}
    $1 SUBSEP $2 in f1 {print f1[$1,$2], $3, $4}
' 1_file.txt 2_files.txt
ChrX 129759713 A G A G
ChrX 129760010 C T C T
ChrX 129762238 C G C G
ChrX 129762448 A G A G
ChrX 129762803 A C A C
ChrX 129763441 C A C A

有关 awk 语法及其工作原理的详细信息,请参阅Stack Overflow 上的 awk 信息页面

这里:

  • NR == FNR该条件仅适用于正在处理的第一个文件的行。在该块中,我们将每一行存储在一个数组中,并以前 2 个字段为键。看傻瓜手册来了解变量的含义。
  • 在数组键中,使用逗号连接使用内置 SUBSEP 变量的字段(参考
  • $1 SUBSEP $2 in f1对于第二个文件中的一行,如果第一个和第二个字段也出现在第一个文件中,则条件为真。

相关内容