![根据公共列合并两个文件,并将 0 添加到文件 2 中不存在的文件中](https://linux22.com/image/189017/%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%8C%E5%B9%B6%E5%B0%86%200%20%E6%B7%BB%E5%8A%A0%E5%88%B0%E6%96%87%E4%BB%B6%202%20%E4%B8%AD%E4%B8%8D%E5%AD%98%E5%9C%A8%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%AD.png)
我想合并两个文件,它们共享一些共同的数据。文件 1 包含的内容多于文件 2。我想按照文件 1 的顺序根据文件的共享列合并文件,并且当文件 2 中不存在该变量时,我想将 0 添加到第 5 列 (AN1)。
我的文件如下所示:文件 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 1
20 9764069 rs2206484 0 1
20 9639395 rs4816159 0 1
我想根据第 3 列 (SNP) 来匹配它们。我想暂时保留所有其他列。
我想要的输出如下所示(当 rsX 不存在时为 0):
文件3
CHR BP SNP CM base AN1
20 61098 rs6078030 -0.00024510777 1 1
20 61795 rs4814683 0 1 1
20 63231 rs6076506 0.0005026053 1 1
20 63244 rs6139074 0.00050714752 1 1
我认为我需要不止 1 步才能做到这一点。我尝试使用 awk 来执行第一步,但它只创建空文件。
awk -F' ' 'NR==FNR{e[$1$2]=1;next};e[$1$2]' file1 file 2 > file 3
awk -F' ' 'NR==FNR{e[$1$2]=1;next};e[1$2]' file2 file 1 > file 3
我想最后一步将是join file1 file 2 > file 3
。
答案1
awk 'NR==FNR{ snp[$3]; next }
{ $6=($3 in snp)?(FNR==1?"AN1":"1"):"0" }1' file2 file1