私は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.txt
file2.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=FNR
awk が最初のファイルを実行したときの条件です。file2.txt
- 2回目の実行で
NR!=FNR
結合キーがある場合は、次の行を印刷します。A
- awk のデフォルトのフィールド区切り文字はすでに空白なので、ここで指定する必要はありません。