Bashは2つの列を「結合」します。

Bashは2つの列を「結合」します。

2つのファイルがあります。

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

2つのファイルをフィールド1と2に1つにマージしたいと思います。

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

2番目のファイルに欠落している行はありますか? 「TG」または「AT」の項目は表示されません。私が知っているjoin限り、2つのフィールドは許可されず、sedを使用して2つのフィールドをリンクできます。具体的な例の例は次のとおりです。

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の構文と仕組みの詳細については、以下を参照してください。スタックオーバーフローのawk情報ページ

ここで:

  • NR == FNRこの条件は、処理中の最初のファイルの行にのみ適用されます。このブロックでは、最初の2つのフィールドをキーとして使用して、各行を配列に格納します。バラより初心者マニュアル変数の意味を理解します。
  • 配列キーのコンマを使用して組み込みSUBSEP変数(引用する)
  • $1 SUBSEP $2 in f12 番目のファイルの行に対して、最初と 2 番目のフィールドが最初のファイルにも表示される場合、条件は true です。

関連情報