我是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进行比较时,我似乎没有得到正确的值。
答案 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
说明:
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)
值的文件。因此,需要bc
或awk
进行数学运算。
如果值的数量为“奇数”,则应在上面的代码中将"$((num / 100 * $p))"
替换为"$(awk "BEGIN {print int($num/100*$p)}")"
。
最后awk
是该答案的一部分。 ;)