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.tsv: 20B- in의 해당 변이 A.tsv에 모든 변이가 있는 경우 clade라는 새 열(마지막 열 뒤)에 인쇄합니다. - 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(GNU의 경우그런 다음) 다음 파일을 읽으십시오(나머지를 계속 진행하고 싶지 않은 경우)문서 B;또한 "클레이드="를 참고하세요.40A"는 fileB에서 고유해야 합니다. 그렇지 않으면 항상 마지막 값을 반환합니다.

관련 정보