데이터 파일이 있습니다 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의 모든 변형이 포함되어 있지 않으면 아무것도 인쇄하지 않습니다. 결과(새 파일에 저장됨)는 다음과 같습니다.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
(GNU의 경우앗그런 다음) 다음 파일을 읽으십시오(나머지를 계속 진행하고 싶지 않은 경우)문서 B;또한 "클레이드="를 참고하세요.40A
"는 fileB에서 고유해야 합니다. 그렇지 않으면 항상 마지막 값을 반환합니다.