【问题标题】:How to reduce a set of lines to take the average?如何减少一组线取平均值?
【发布时间】:2012-11-06 13:24:39
【问题描述】:

我有一个包含这样行的文件(列是制表符分隔的)

2    1.414455    3.70898
2    2.414455    3.80898
2    3.414455    3.90898
2    1.414455    3.90898
4    4.414455    7.23898
4    3.414455    6.23898
4    5.414455    8.23898

即有连续的行,其中第一列是整数,其余两列是浮点数。

我想减少它们如下

2    2.164455    3.75898
4    4.414455    7.23898

我保留第一列,并对具有相同第一列的所有元素取第二列和第三列的平均值。具有相同第一个元素的连续行数可能不同,但它们始终是连续的。

我可以在 perl 中做到这一点,但想知道是否有更简单的 bash / sed / awk 组合可以为我做同样的事情?

【问题讨论】:

    标签: bash unix sed awk


    【解决方案1】:

    使用 awk:

    awk '{a[$1]+=$2;b[$1]+=$3;c[$1]++;}END{for(i in c)print i, a[i]/c[i],b[i]/c[i];}' file
    2 2.16445 3.83398
    4 4.41446 7.23898
    

    使用 3 个不同的数组:a 和 b 保存第 2 列和第 3 列的总和,c 保存元素的计数。最后,计算平均值并打印出来。

    【讨论】:

    • 效果很好!但是这些值是按相反的顺序打印的,先打印 4 的行,然后打印 2 的行。
    • @Moeb :如果您希望输出按排序顺序,您可以使用“sort -n”来管道此 awk 命令,这将使结果排序。
    • 大师,这是一个很好的代码。我的方法太长了:-)
    猜你喜欢
    • 2019-05-18
    • 2014-10-17
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多