테이블 작업

테이블 작업

게놈 좌표와 마지막 열이 일반 이름인 세 개의 파일이 있습니다.

파일 1.

X 1 100 B
Y 101 200 B
Z 1 50 B

파일 2.

X 200 300 A 
Y 101 200 A
Z 1 50 A

파일 3.

X 1 100 C
Y 200 300 C
Z 1 50 C

마지막 열을 기준으로 데이터를 연산하고 싶습니다.

Name Value1 Value2 A B C
X 1 100 No Yes Yes
X 200 300 Yes No No
Y 101 200 Yes Yes No
Y 200 300 No No Yes
Z 1 50 Yes Yes Yes

.. 이와 같이.

도울 수 있니?

답변1

해결책:

awk 'function get_mask(keys){ 
         mask=""; 
         for(i in h) { 
             res=(keys~i)?"Yes":"No"; mask=(mask!="")? mask FS res:res 
         } 
         return mask 
     }
     { k=$1 FS $2 FS $3 }{ h[$4]; a[k]=(a[k])? a[k]$4:$4 }
     END{ 
         h_line=""; for(i in h) h_line=(h_line=="")? i:h_line FS i;
         printf "Name Value1 Value2 %s\n",h_line;
         for(j in a) printf "%s %s\n", j, get_mask(a[j]) 
     }' file{1,2,3}

산출:

Name Value1 Value2 A B C
Z 1 50 Yes Yes Yes
Y 101 200 Yes Yes No
Y 200 300 No No Yes
X 1 100 No Yes Yes
X 200 300 Yes No No

답변2

Roman의 답변과 매우 유사하지만 조금 더 간단하다고 생각합니다.

gawk '
    { key = $1 FS $2 FS $3; names[$NF] = 1; has_name[key][$4] = 1 }
    END {
        PROCINFO["sorted_in"] = "@ind_str_asc"
        printf "Name Value1 Value2"
        for (v in names) printf " %s", v
        print ""
        for (key in has_name) {
            printf "%s", key
            for (v in names) printf " %s", has_name[key][v] ? "Yes" : "No"
            print ""
        }
    }
' file{1,2,3}
Name Value1 Value2 A B C
X 1 100 No Yes Yes
X 200 300 Yes No No
Y 101 200 Yes Yes No
Y 200 300 No No Yes
Z 1 50 Yes Yes Yes

GNU awk PROCINFO변수를 사용하여배열 순회 제어정렬순서입니다.

관련 정보