![根据公共列合并两个文件;如果文件 2 中存在该变体,则保留该值,并为文件 2 中不存在的变体添加 0](https://linux22.com/image/189254/%E6%A0%B9%E6%8D%AE%E5%85%AC%E5%85%B1%E5%88%97%E5%90%88%E5%B9%B6%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%9B%E5%A6%82%E6%9E%9C%E6%96%87%E4%BB%B6%202%20%E4%B8%AD%E5%AD%98%E5%9C%A8%E8%AF%A5%E5%8F%98%E4%BD%93%EF%BC%8C%E5%88%99%E4%BF%9D%E7%95%99%E8%AF%A5%E5%80%BC%EF%BC%8C%E5%B9%B6%E4%B8%BA%E6%96%87%E4%BB%B6%202%20%E4%B8%AD%E4%B8%8D%E5%AD%98%E5%9C%A8%E7%9A%84%E5%8F%98%E4%BD%93%E6%B7%BB%E5%8A%A0%200.png)
我想合并两个文件,它们共享一些共同的数据。文件 1 包含多个文件 2。我想按照文件 1 的顺序根据共享列 (3) 合并文件,并且当文件 2 中不存在该变量时,我想将 0 添加到第 5 列 (AN1),如果存在,添加 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