如何在 awk 中比较两个文件中具有特定条件的两列

如何在 awk 中比较两个文件中具有特定条件的两列

我有一个数据文件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.tsv20B- 如果 中 的相应突变具有inA.tsv的所有突变,则在名为clade 的新列(在最后一个之后)中打印。 - 如果in 中的行包含其他突变,而不是来自in 的突变,这不是问题。 - 如果in行不包含in中的所有突变,则不打印任何内容。结果(存储在新文件中)将如下所示:40AB.tsvA.tsvConclusion40A20BA.tsv40AB.tsv20BA.tsv40AB.tsvC.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 中应该是唯一的,否则它将始终返回最后一个值。

相关内容