共通列に基づいて2つのファイルをマージします。バリアントがファイル2にある場合は、値を保持し、ファイル2にないバリアントに0を追加します。

共通列に基づいて2つのファイルをマージします。バリアントがファイル2にある場合は、値を保持し、ファイル2にないバリアントに0を追加します。

共通データを共有する2つのファイルをマージしたいです。 File1には複数のファイルが含まれています2。共有列(3)を基準にファイル1を基準にファイルをマージしたいのですが、ファイル2に変数がなければ5番目の列(AN1)に0を追加して、あれば追加したいと思います。 AN1(連続変数)の元の値。

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

CHR BP  SNP CM  base
10 99969507 rs35122894 0 0.23
10 99966455 rs17451447 0 1
10 99964768 rs72826281 0 0.43
10 9996313 rs111848993 0 0.01

ファイル2

CHR BP  SNP CM  AN1
10 99969507 rs35122894 0 1.000000000000000
10 99966455 rs17451447 0 0.678999997353345
10 99964768 rs72826281 0 0.876534244415788
10 9996313 rs111848993 0 0.003456777789882

列3(SNP)に基づいて一致させたいです。今は他のすべての熱を維持したいと思います。

私が望む出力は次のとおりです。ファイル3

CHR BP  SNP CM  base AN1
10 99969507 rs35122894 0 0.23 1.000000000000000
10 99966455 rs17451447 0 1 0.678999997353345
10 99964768 rs72826281 0 0.43 0.876534244415788
10 9996313 rs111848993 0 0.01 0.003456777789882

私はawkを使ってこれをやろうとしています。

awk 'NR==FNR{ snp[$3]; next }
{ $6=($3 in snp)?(FNR==?"AN1[$5]):"0" }1' file2 file1 > file3
awk 'NR==FNR{a[$3]=$5;next} {print $1,$2,a[$3],$4,$5,$6}' File2 File1 > file3

答え1

$ awk 'NR==FNR{an1[$3]=$5; next} {print $0, an1[$3]}' file2 file1
CHR BP  SNP CM  base AN1
10 99969507 rs35122894 0 0.23 1.000000000000000
10 99966455 rs17451447 0 1 0.678999997353345
10 99964768 rs72826281 0 0.43 0.876534244415788
10 9996313 rs111848993 0 0.01 0.003456777789882

0質問の下のあなたのコメントに従って配列にないときにSNP値を印刷するには、次の手順を実行します。

awk 'NR==FNR{an1[$3]=$5; next} {print $0, ($3 in an1 ? an1[$3] : 0)}' file2 file1

関連情報