代码之家  ›  专栏  ›  技术社区  ›  Jukka

计算中值

  •  -2
  • Jukka  · 技术社区  · 11 月前

    我有一个包含数千行的文本文件,每行都有一个数值。值在-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的了解非常有限。也许受过更多教育的人可以帮助我。

    1 回复  |  直到 11 月前
        1
  •  0
  •   Andrew    11 月前

    我不确定你所说的“一个有一个小数的十进制数”是什么意思(如果你想要的话,我无法将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