计算值列表上每个值的平均值

计算值列表上每个值的平均值

我有一个巨大的文件(50k行),格式如下:

52370581 2116
17996781 4314
47818829 2584
61421045 2158
...
25145813 2274

第一个值可以出现多次,我想使用终端计算每个第一个值的第二个值的平均值。理想情况下,我还想要中位数、最小值和最大值。我可以很容易地对所有值执行此操作,awk但我想知道如何对每个值执行此操作。

答案1

awk '{c[$1]++;s[$1]+=$2}END{for(i in c)print i,(s[i]/c[i])}' test.in

更具可读性:

awk '
{ # Every line
    # Increment the key, add value to its sum
    count[$1]++
    sum[$1] += $2
}
END {
    # Go through all the numbers we saw
    for(number in count) {
        # Print the number followed by the average (sum/count) of its values
        print number, (sum[number]/count[number])
    }
}
' test.in

请注意,数字将以或多或少随机的顺序输出(一些键的哈希值)。获取最小值和最大值并不难,只需在第一个块之后count和里面添加它们sum即可。中位数需要跟踪每个数字。您可以使用二维数组(或 awk 的模拟)来完成此操作,但我将其留给读者作为练习。

答案2

平均而言

awk '{if(NR==1){i=$1;}} {if($1~i){j+=$2;k++}} END{print "Average is " (j/k)}' <filename>

如果您只想对第一行的值执行此操作,这将为您提供帮助。如果NR==0您传递一个变量,则可以针对任何特定行执行此操作。现在,如果您想对每一行执行此操作,那么下面的 awk 将在一次传递中完成此操作

awk '{value[$1]+=$2;count[$1]++} END{for(indx in value)print "Avarage of " indx " is " (value[indx]/count[indx])}' <filename>

awk 有二维数组,但我对此不熟悉,因此使用 2 个数组来保存元素的总和和计数。任何其他操作,我们都需要根据操作更改脚本

相关内容