共通列に基づいて2つのファイルをマージします。ファイル2に存在しないバリアントにゼロを追加し、存在するバリアントに元の値を保持します。

共通列に基づいて2つのファイルをマージします。ファイル2に存在しないバリアントにゼロを追加し、存在するバリアントに元の値を保持します。

共通データを共有する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次に、次のブロックでは、次の条件を使用して列値を追加/更新します。

  • snpfile1の列3がfile2の配列に設定されている場合は、次のようにします。
    • 最初の行の場合は、その値を次に設定します。AN1
    • 最初の行でない場合は、値を次から開始するように設定します。snp[$3]大量に。
  • それ以外の場合は、次のように設定されます。0

これアッエドム1最終的に結果を印刷するために使用されます。

関連情報