【问题标题】:Awk: substituting each n lines with their average, for each columnawk:用它们的平均值代替每 n 行,对于每一列
【发布时间】:2013-09-06 04:50:08
【问题描述】:

如何使用 awk 将文件的每 n 行替换为其平均值?

这个问题完美地回答了,除了它只处理一列并且3 没有参数化: How to sum up every 10 lines and calculate average using AWK?

基本上我想要这样的文件

1     1
2     1
3     1
4     1
5     1
6     1
2.5   2.0
3.5   2.0
4     2.0

并获得类似的东西:

2     1   
5     1
3.33  2.0

【问题讨论】:

    标签: awk average


    【解决方案1】:
    $ awk -v rows=3 '{c1+=$1; c2+=$2} (NR%rows)==0{printf "%.2f %.2f\n", c1/3, c2/3; c1=0; c2=0}' input
    2.00 1.00
    5.00 1.00
    3.33 2.00
    

    【讨论】:

    • 您在帖子中错过了'
    • @Jotne 谢谢,已修复。
    【解决方案2】:

    这是一个完整的 shell 脚本:

    awk -v count=3 '
        {
            if ( NF > tot_col )
                tot_col = NF;
    
            cur = 1;
            while ( cur <= NF )
            {
                sums[cur] += $cur;
                cur++;
            }
    
            if ( ( NR % count ) == 0 )
            {
                cur = 1;
                while ( cur <= tot_col )
                {
                    printf("%0.2f ", sums[cur] / count);
                    cur++;
                }
    
                print "";
    
                delete sums;
                tot_col = 0;
            }
        }' "$@"
    

    【讨论】:

    • 请注意,问题中描述的输出存在不一致。有些打印为整数,有些打印为 .0 等。答案中没有包含这些内容,因为不清楚它是否重要,如果重要,格式化应该使用什么逻辑。
    • 非常感谢您的快速回复。一切的浮点输出对我来说都可以
    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多