基于公共列合并两个文件;对于文件 2 中不存在的变体添加 0,并在存在的变体中保留原始值

基于公共列合并两个文件;对于文件 2 中不存在的变体添加 0,并在存在的变体中保留原始值

我想合并两个文件,它们共享一些共同的数据。文件 1 包含多个文件 2。我想按照文件 1 的顺序根据共享列 (3) 合并文件,并且当文件 2 中不存在该变量时,我想将 0 添加到第 5 列 (AN1),如果存在,添加 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 不存在时为 0,或者当 AN1 的原始值为 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。

因此,仅对于第一个输入文件,条件始终为真,并且当条件为真时,将执行NR==FNR以下块,并且我们确实将最后一列值保存到NR==FNR { ... }$NFawk以列为键的snp数组。$3

next陈述原因awk跳过执行其余代码并重新开始,如果NF==FNR仍然为真,它将重复处理该块,直到读取第一个输入文件的所有记录/行。

$6然后在下一个块中,我们使用以下条件添加/更新列的值:

  • 如果 file1 中的第 3 列设置在snpfile2 的数组中,则执行以下操作:
    • 如果它是第一行,则将其值设置为AN1
    • 如果不是第一行,则将其值设置为从snp[$3]大批。
  • 否则设置为0

awk伊多姆1毕竟用来打印结果。

相关内容