我想创建awk代码,它可以在$ 4列中为所有行找到相同的数字,并计算$ 4,$ 5列的中位数和平均值,并将其合并为一行。
INPUT:
chr10 89623184 89624315 1 0.2062732989
chr10 89623184 89624315 1 0.2155829606
chr10 89623184 89624315 1 0.2471277767
chr10 89623184 89624315 2 0.2236894639
chr10 89623184 89624315 2 0.2291949506
chr10 89623184 89624315 2 0.2252482173
输出:
MEAN MEDIAN MEAN chr10 89623184 89624315 1 0.2155829606 0.2229946787 chr10 89623184 89624315 2 0.2252482173 0.2260442106
谢谢你的帮助。
答案 0 :(得分:1)
awk
救援!
awk '{
k = $1 FS $2 FS $3 FS $4
s[k] += $5
v[k] = k in v ? v[k] FS $5 : $5
}
END {
for(i=1;i<=length(k);i++) printf "%s"," "
printf " %s %s\n","MEDIAN","MEAN"
for (k in s) {
n = split(v[k], m, FS)
asort(m)
median = n%2==0 ? (m[n/2]+m[n/2+1])/2 : m[(n-1)/2]
print k, median, s[k]/n
}
}' file
MEDIAN MEAN
chr10 89623184 89624315 1 0.2062732989 0.222995
chr10 89623184 89624315 2 0.2236894639 0.226044
您的密钥需要是前四个字段,而不仅仅是4.对于中位数计算,如果有偶数个观察值,则计算中间值的平均值。