我想合并两个共享一些公共数据的文件。文件 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)
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 { ... }
当它为真时将执行以下块,并且我们确实将最后一列值保存$NF
到一个以列为键的awk数组中。snp
$3
next
语句导致awk跳过执行其余代码并重新开始,如果NF==FNR
仍然为真,它将重复处理该块,直到读取第一个输入文件的所有记录/行。
然后在下一个块中,我们$6
使用以下条件添加/更新列的值:
snp
file2 的数组中,则执行以下操作:
AN1
snp[$3]
数组中读取的值。0
.本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句