获取第一列条目重复的所有条目的列平均值

获取第一列条目重复的所有条目的列平均值

我有一个如下所示的文件:

30901 foo1 bar1 89
30902 foo2 bar2 51
30903 foo3 bar3 101
30903 foox bary 12
30903 fooz bara 23
30903 foob barc 62
30904 fooe barf 59
...
...

我希望我的输出具有如下输出:

30901 89
30902 51
30903 49.5
... 

49.5是第四列的平均值,对于30903第 1 列中 id: 的所有四个重复条目。

我所能做的就是获取唯一条目的数量,用于
cat <logfile> | awk '{print $1}' | uniq -c
根据第一列(id)获取重复条目的数量

答案1

尝试

 awk '{c[$1]++ ; t[$1]+=$4 }  
    END { for (cc in c ) if ( c[cc]>1 ) printf "%s : %.1f\n",cc,t[cc]/c[cc];}' file.log

这给了

30903 : 49.5

要获得输出,请删除if (c[cc]>1)部分。

该脚本基本上是计数c[$1]++t[$1]+=$4增值。

  • c[x]用于 count(x),即$1:第一个字段
  • t[x]是total(x),即第4个字段的总值之和

最后,我们循环所有值,计算并打印平均值。

答案2

与米勒(http://johnkerl.org/miller/doc)你可以运行

mlr --nidx stats1 -a mean -f 4 -g 1 inputFile

并有

30901 89.000000
30902 51.000000
30903 49.500000
30904 59.000000
  • -f 4设置要计算统计数据的值字段名称(第四个字段);
  • -g 1设置按字段名称分组(第一个字段)。

相关内容