게놈 좌표와 마지막 열이 일반 이름인 세 개의 파일이 있습니다.
파일 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
변수를 사용하여배열 순회 제어정렬순서입니다.