AWK를 사용하여 검색하고 바꾸지만 여러 열과 구분 기호가 있는 파일에서는

AWK를 사용하여 검색하고 바꾸지만 여러 열과 구분 기호가 있는 파일에서는

파일 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

위에서 나는 주석이 해당 줄 내에 모두 존재하고 고유한 한 출력의 각 줄에 나타나는 주석의 순서는 중요하지 않다고 가정했습니다.

관련 정보