ゲノム座標と最後の列が一般名である3つのファイルがあります。
ファイル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 awkPROCINFO
変数を使用して配列巡回制御ソート順です。