我有一个包含数千行的文本文件,每行都有一个数值。值介于 -2.5 - 2.5 之间,一位小数。
我用这条线给出最低值、最高值、中值和平均值。
awk '{a[i++]=$0;s+=$0}END{print a[0],a[i-1],(a[int(i/2)]+a[int((i-1)/2)])/2,s/i}
它在其他方面很完美,但我想将中位数作为小数点后一位的小数。现在它返回一个整数。
你能帮我吗?
我对awk的了解非常有限。也许受过更多教育的人可以帮助我。
我不确定你所说的“带有一位小数的十进制数”是什么意思(我无法将 0.1 变为 .1,如果这是你想要的),并且你需要确保你的 awk 版本支持 asort( ),但是这个(今天在 https://www.jdoodle.com/execute-awk-online 运行,应该是“NU AWK 5.1.1,API 版本为据我所知,3.1")应该有帮助:
代码:
BEGIN{
highest=-2.6
lowest=2.6
}{
a[NR]=$0
if($0>highest){highest=$0}
if($0<lowest){lowest=$0}
average=average+$0
}END{
n=asort(a)
if(n%2==1){median=a[(n+1)/2]}else{median=(a[n/2]+a[n/2+1])/2}
printf("lowest=%f, highest=%f, average=%f, median=%1.1f\n",
lowest, highest, average/NR, median)
}
输入(注意——不能有空行。):
-2.5
-1.4
0.1
-0.9
2.4
2.3
2.2
输出:
lowest=-2.500000, highest=2.400000, average=0.314286, median=0.1