共通データを共有する2つのファイルをマージしたいです。 File1には複数のファイルが含まれています2。共有列(3)に基づいてファイル1を基準にファイルをマージしたいのですが、ファイル2に変数がない場合は5番目の列(AN1)に0を追加し、存在する場合はAN1の元の値(0または1)を追加します。
私のファイルは次のとおりです。ファイル1
CHR BP SNP CM base
20 61098 rs6078030 -0.00024510777 1
20 61795 rs4814683 0 1
20 63231 rs6076506 0.0005026053 1
20 63244 rs6139074 0.00050714752 1
ファイル2
CHR BP SNP CM AN1
20 9836704 rs221007 0 1
20 9817032 rs221011 0 0
20 9764069 rs2206484 0 0
20 9639395 rs4816159 0 1
列3(SNP)に基づいて一致させたいです。今は他のすべての熱を維持したいと思います。
私が望む出力は次のとおりです(rsXがない場合、またはAN1の元の値が0の場合は0)。
ファイル3
CHR BP SNP CM base AN1
20 61098 rs6078030 -0.00024510777 1 1
20 61795 rs4814683 0 1 0
20 63231 rs6076506 0.0005026053 1 0
20 63244 rs6139074 0.00050714752 1 1
新しい状況に応じてこのコードを修正する必要があります。
awk 'NR==FNR{ snp[$3]; next }
{ $6=($3 in snp)?(FNR==1?"AN1":"1"):"0" }1' file2 file1
ここでは、ファイル1にrsXがある場合は1を印刷します。 AN1の元の値(0または1)を印刷したいです。
答え1
awk 'NR==FNR{ snp[$3]=$NF; next }
{ $6=($3 in snp)?(FNR==1?"AN1":snp[$3]):"0" }1' file2 file1
問題は次のとおりですawk
。
NR
:これまでに見た入力レコードの総数。
FNR
: 次の入力ファイルでは、現在の入力ファイルの入力レコード番号が 1 にリセットされます。
したがって、最初の入力ファイルに対してのみ条件が常にtrueであり、条件がtrueの場合、次のブロックがNR==FNR
実行され、最後の列の値NR==FNR { ... }
$NF
アッ列としてキーが割り当てられた配列snp
です。$3
next
状態理由アッ残りのコード実行をスキップして再起動します。NF==FNR
それでも真の場合、最初の入力ファイルのすべてのレコード/行が読み取られるまでブロックを繰り返し処理します。
$6
次に、次のブロックでは、次の条件を使用して列値を追加/更新します。
snp
file1の列3がfile2の配列に設定されている場合は、次のようにします。- 最初の行の場合は、その値を次に設定します。
AN1
- 最初の行でない場合は、値を次から開始するように設定します。
snp[$3]
大量に。
- 最初の行の場合は、その値を次に設定します。
- それ以外の場合は、次のように設定されます。
0
。
これアッエドム1
最終的に結果を印刷するために使用されます。