파일 1의 유전자 이름을 파일 2의 유전자 주석 정보로 바꾸고 싶습니다.
파일 1은 다음과 같습니다. 첫 번째 열에는 OG 식별자가 있고 두 번째부터 Xnd 열에는 유전자 이름이 있습니다.
OG0000008,aly11306X1, aly15270X1, aly1603X45, aly1603X46
OG0000009,Tni22G01870, Tni22G01880, Tni22G01890, Tni22G01900, Tni22G01910, Tni22G01920
OG0000010,BANYX1.2.t00767, BANYX1.2.t00769, BANYX1.2.t00774, BANYX1.2.t00775, BANYX1.2.t00861
참고 사항: 2열의 모든 유전자 이름
aly11306X1 Pfam PF16207 IPR032443
aly15270X1 Pfam PF13923
aly1603X45 Pfam PF01509 IPR002501 GO:0006396
aly1603X46 Pfam PF04845 IPR006628 GO:0000977|GO:0032422
Tni22G01870 Pfam PF02779 IPR005475
Tni22G01880 Pfam PF02780 IPR033248
Tni22G01890 Pfam PF00456 IPR005474
Tni22G01900 Pfam PF04949 IPR007033
Tni22G01910 Pfam PF00250 IPR001766 GO:0003700|GO:0006355|GO:0043565
Tni22G01920 Pfam PF00379 IPR000618 GO:0042302
BANYX1.2.t00767 Pfam PF00400 IPR001680 GO:0005515
BANYX1.2.t00769 Pfam PF00400 IPR001680 GO:0005515
BANYX1.2.t00774 Pfam PF00400 IPR001680 GO:0005515
BANYX1.2.t00775 Pfam PF00400 IPR001680 GO:0005515
BANYX1.2.t00861 Pfam PF04949 IPR007033
BANYX1.2.t00861 Pfam PF08704 IPR014816 GO:0016429|GO:0030488|GO:0031515
출력 파일에서 파일 1의 열 1에 있는 OG 식별자를 검색하고 파일 2의 열 3에 있는 유전자 주석을 검색하려고 합니다. 즉, 파일 1의 유전자 이름을 파일 2의 유전자 PF 번호로 바꿔야 합니다. 여기서는 구분 기호에 대해 별로 신경 쓰지 않습니다.
산출:
OG0000008 PF16207 PF13923 PF01509 PF04845
OG0000009 PF02779 PF02780 PF00456 PF04949 PF00250 PF00379
OG0000010 PF00400 PF04949 PF08704
이 문제를 해결하려고 시도했지만 파일 길이가 실제로 1000 레코드이므로 작동하지 않습니다. AWK로 전환하기로 결정했지만 아쉽게도 저의 awk 지식은 제한되어 있지만 정말 더 나아지고 싶습니다. 여기서 나를 도와주실 수 있나요?
간단하게 시작하여 두 번째 열 내에서만 검색을 시도했지만 전체 파일이 인쇄됩니다.
awk -F "," 'NR==FNR{a[$2];next} $2 in a {print $1, $3}' File1 File2
누구든지 나를 도와줄 수 있나요?
답변1
배열의 배열에 GNU awk 사용:
$ cat tst.awk
NR==FNR {
genes_annots[$1][$3]
next
}
{
delete annots
for ( i=2; i<=NF; i++ ) {
gene = $i
if ( gene in genes_annots ) {
for ( annot in genes_annots[gene] ) {
annots[annot]
}
}
}
printf "%s", $1
for (annot in annots) {
printf "%s%s", OFS, annot
}
print ""
}
$ awk -f tst.awk file2 FS='[, ]+' file1
OG0000008 PF01509 PF16207 PF13923 PF04845
OG0000009 PF00250 PF02779 PF00379 PF04949 PF00456 PF02780
OG0000010 PF08704 PF04949 PF00400
위 방법은 동일한 주석이 있는 2개의 독립적인 유전자가 있는 경우에도 작동합니다. 예를 들어 유전자 Tni22G01900 및 BANYX1.2.t00861에는 모두 주석 PF04949가 있습니다.
$ cat file3
OG0000099,Tni22G01900, BANYX1.2.t00861
$ awk -f tst.awk file2 FS='[, ]+' file3
OG0000099 PF08704 PF04949
위에서 나는 주석이 해당 줄 내에 모두 존재하고 고유한 한 출력의 각 줄에 나타나는 주석의 순서는 중요하지 않다고 가정했습니다.