我有三个文件,其中基因组坐标和最后一列作为通用名称
文件 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解决方案:
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
与罗马的答案非常相似,但我认为更简单一些
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
变量来控制数组遍历按排序顺序。