我有一个巨大的文件(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 个数组来保存元素的总和和计数。任何其他操作,我们都需要根据操作更改脚本