用awk计算第95百分位数

时间:2014-07-11 22:44:04

标签: awk

我是awk脚本中的新手,并希望在计算包含此数据的文件的第95百分位值时有一些帮助:

0.0001357
0.000112
0.000062
0.000054
0.000127
0.000114
0.000136

我试过了:

cat filename.txt | sort -n |
awk 'BEGIN{c=0} {total[c]=$1; c++;} END{print total[int(NR*0.95-0.5)]}'

但是当我将它与excel进行比较时,我似乎没有得到正确的值。

3 个答案:

答案 0 :(得分:5)

我不确定Excel是否会执行某种加权百分位数,但如果您确实需要原始集合中的某个数字,那么您的方法应该可以正常进行舍入。

你可以像这样简化一下,但这是一回事。

sort -n input.txt  | awk '{all[NR] = $0} END{print all[int(NR*0.95 - 0.5)]}'

答案 1 :(得分:2)

按照建议的here计算,您可以执行以下操作:

sort file -n | awk 'BEGIN{c=0} length($0){a[c]=$0;c++}END{p5=(c/100*5); p5=p5%1?int(p5)+1:p5; print a[c-p5-1]}'

给定输入的输出:

sort file -n | awk 'BEGIN{c=0} length($0){a[c]=$0;c++}END{p5=(c/100*5); p5=p5%1?int(p5)+1:p5; print a[c-p5-1]}'
0.0001357

说明:

  1. 以数字方式对文件进行排序
  2. 放弃前5%
  3. 选择下一个值
  4. PS。声明p5=p5%1?int(p5)+1:p5正在进行多种语言的ceil操作。

答案 2 :(得分:0)

仅作记录,还有受merlin2011答案启发的解决方案,可以打印出几个所需的百分位数:

# get amount of values
num="$(wc -l input.txt | cut -f1 -d' ')";
# sort values
sort -n input.txt > temp && mv temp input.txt
# print the desired percentiles
for p in 50 70 80 90 92 95 99 100; do 
  printf "%3s%%: %-5.5sms\n" "$p" "$(head input.txt -n "$((num / 100 * $p))" | tail -n1)";
done

更新:我搞砸了。 Bash数学无法处理浮点数,即使在“单个表达式”中使用也不能。仅适用于具有100*(N>0)值的文件。因此,需要bcawk进行数学运算。

如果值的数量为“奇数”,则应在上面的代码中将"$((num / 100 * $p))"替换为"$(awk "BEGIN {print int($num/100*$p)}")"

最后awk是该答案的一部分。 ;)