awk 2つのキー列に基づいて2つのファイルをリンクします。

awk 2つのキー列に基づいて2つのファイルをリンクします。

私は2つの主要な列(染色体と位置)に基づいて2つの大きなファイルをマージしようとしましたが、私が見つけた最も効率的な方法はawk

私のファイルの例は次のとおりです。

file1.txt
Gene_ID Chromosome Position Fst
ENSG00000141424 18 33688658 0
ENSG00000141424 18 33688669 0
ENSG00000141424 18 33688681 0
ENSG00000141424 18 33688683 0.0111734
ENSG00000141424 18 33688720 0
ENSG00000141424 18 33688726 0
ENSG00000141424 18 33688743 0
ENSG00000141424 18 33688745 0
ENSG00000141424 18 33688763 0

その他のファイル:

file2.txt
Chromosome Start End Ref Alt RS_ID
1   10019   10020   TA  T   rs775809821
1   10020   10020   A   -   rs775809821
1   10055   10055   -   A   rs768019142
1   10055   10055   T   TA  rs768019142
1   10108   10108   C   T   rs62651026
1   10109   10109   A   T   rs376007522
1   10128   10128   A   AC  rs796688738
1   10128   10128   -   C   rs796688738
1   10139   10139   A   T   rs368469931
1   10144   10145   TA  T   rs144773400

私は次の3番目のファイルが欲しい。

Gene_ID Chromosome Position RS_ID Fst
ENSG00000141424 18 33688658 rs1504554... 0

を使ってみましたが、構文は大丈夫だと思いますが、私が得るものは含まれていてリンクされたawkファイルだけです。file1.txtfile2.txt

awk  'FS=" "; OFS=" ";NR=FNR{A[$1,$2]=$6;next}{$5=A[$2,$3];print}' file1.txt file2.txt > file3.txt

何が間違っているのかというアイデアはありますか?

答え1

コードをいくつか修正すると問題が解決します。

awk 'NR==FNR{A[$1,$2]=$6;next}{$5=A[$2,$3];if($5!="")print}' file2.txt file1.txt
  • NR==FNRそして of はNR=FNRawk が最初のファイルを実行したときの条件です。file2.txt
  • 2回目の実行でNR!=FNR結合キーがある場合は、次の行を印刷します。A
  • awk のデフォルトのフィールド区切り文字はすでに空白なので、ここで指定する必要はありません。

関連情報