我有一个数据文件A.tsv
(字段分隔符= \t
):
id clade mutation
243 40A titi,xixi,lolo
254 20B titi,toto,jiji,lala
261
267 20B lala,jiji,jojo
和一个模板文件B.tsv
(字段分隔符 = \t
):
40A titi,toto,lala
40F xaxa,jojo,huhu
40C sasa,sisi,lala
基于他们的共同列(clade),我想比较A.tsv
来自模板的突变B.tsv
。当 clade 为A.tsv
:20B
- 如果 中 的相应突变具有inA.tsv
的所有突变,则在名为clade 的新列(在最后一个之后)中打印。 - 如果in 中的行包含其他突变,而不是来自in 的突变,这不是问题。 - 如果in行不包含in中的所有突变,则不打印任何内容。结果(存储在新文件中)将如下所示:40A
B.tsv
A.tsv
Conclusion
40A
20B
A.tsv
40A
B.tsv
20B
A.tsv
40A
B.tsv
C.tsv
id clade mutation Conclusion
243 40A titi,xixi,lolo
254 20B titi,toto,jiji,lala 40A
261
267 20B lala,jiji,jojo
我从那开始:
awk 'BEGIN{ OFS=FS="\t" }
NR==FNR{ clade[$1]=$2; next }
FNR==1{ print $0, "Conclusion"; next }
!($2 in clade){ print; next }
{
split($3 "," clade[$2], tmp, ",")
for (i in tmp)
if (++num[tmp[i]] > 1)
++count
print $0, count
delete num
count=0
}
' B.tsv A.tsv > C.tsv
但我不知道剩下的该怎么做。你有好主意吗?谢谢
答案1
awk 'BEGIN { FS=OFS="\t" }
NR==FNR { if($1=="40A") { cladeB=$1; mutB=$2; "nextfile" }; next }
FNR==1 && mutB{ $4="Conclusion"; }
{ mutbak=mutB; split($3, muts, ","); for(x in muts) gsub(muts[x], "", mutbak) }
{ print $0, (mutbak ~ /^[[:blank:],]*$/ && $2=="20B" )?cladeB:""}' fileB fileA
取消引用该nextfile
语句(对于 GNUawk然后)读取下一个文件(如果您不想继续处理其余部分)文件B;还要注意“进化枝=40A
" 在 fileB 中应该是唯一的,否则它将始终返回最后一个值。