awk 根据第二列中的键对列进行平均

awk 根据第二列中的键对列进行平均

我有

Sample_A   100
Sample_A   200
Sample_B   300
Sample_B   100

我想打印第 1 行中每个键的第 2 行中值的平均值

Sample_A   150
Sample_B   200

我可以使用另一个问题的优秀答案打印第 1 行中每个键的第 2 行中的值的总和: 根据第二列求和第一列

命令是:

awk 'NR { k = $1; cnt[k] += $2 } END { print; for (k in cnt) print k,cnt[k]}' File.txt

这会产生

Sample_A  300
Sample_B  400

但为了计算平均值,我需要一种方法来保存键出现的次数,例如

awk 'NR { k = $1; cnt[k] += $2; count(k)=$2} END { print; for (k in cnt) print k,cnt[k]/count(k)}' File.txt

但我的count(k)代码有点盲目,不起作用。

答案1

awk你一起可以做:

awk '{seen[$1]+=$2; count[$1]++} END{for (x in seen)print x, seen[x]/count[x]}' infile
Sample_A 150
Sample_B 200

或者使用GNUdatamash:

datamash -t' ' --sort --group 1 mean 2 <infile
Sample_A 150
Sample_B 200

答案2

$ awk '{ sum[$1] += $2; count[$1] += 1 } END { for ( key in count ) { print key, sum[key] / count[key] } }' input
Sample_A 150
Sample_B 200

要得出平均值,您需要两件事:被平均的实体数量的计数以及这些值的总和。count对于前者,我们使用一个数组,sum对于后者,我们使用一个数组。每个数组中的键都分配给数据文件中的第一列。

END然后,在收集数据后,我们使用一个子句来查看每个数组以获取总和和计数,将一个数组除以另一个数组,然后显示结果。

awk脚本经过重新格式化,不再全部在一行上,如下所示:

{ 
  sum[$1] += $2 
  count[$1] += 1
} 
END { 
  for (key in count) { 
    print key, sum[key] / count[key] 
  } 
}

相关内容