【问题标题】:Calculate Average of Column Data with Headers计算带有标题的列数据的平均值
【发布时间】:2013-02-27 06:06:56
【问题描述】:

例如,我有如下数据:

Flats 2b 
01/1991, 3.45
01/1992, 4.56
01/1993, 4.21
01/1994, 5.21
01/1995, 7.09
01/2013, 6.80
Eagle 2
01/1991, 4.22
01/1992, 6.32
01/1993, 5.21
01/1994, 8.09
01/1995, 7.92
01/2013, 6.33

我正在尝试计算第 2 列的平均值,以便我想要的输出最好如下所示:

Flats 2b
Avg = 4.67
Eagle 2
Avg = 5.26

甚至更简单,看起来像这样没有标题: 平均 = 4.67 平均 = 5.26

等等...因为输入文件充满了许多带有如上所示数据的标题。

我尝试做模式匹配选项,并使用 NR 作为 awk one-liner,但没有成功:

awk '/01/1991,/01/1993 {sum+=$2; cnt+=1} {print "Avg =" sum/cnt}' myfile.txt

我得到了每个气象塔分别在 1991、1992 和 1993 年的平均值,但不是我想要的平均值。
非常感谢您的帮助!

【问题讨论】:

    标签: awk


    【解决方案1】:

    如果你只想考虑 1991-1993 年

    #! /usr/bin/awk -f
    
    # new header, print average if exists, reset values
    /[a-zA-Z]/ {
        if (cnt > 0) {
            print header;
            printf("Avg = %.2f\n", sum/cnt);
        }
        header=$0; sum=0; cnt=0;
    }
    
    # calculate average
    /^01\/199[123]/ { sum+=$2; cnt++; }
    
    # print last average
    END {
        if (cnt > 0) {
            print header;
            printf("Avg = %.2f\n", sum/cnt);
        }
    }
    

    这会查找 awk 脚本查找标题,打印平均值(如果有),然后重置所有变量以进行下一次平均值计算。如果它找到一个数据行,它会在以后计算平均值所需的总和。如果读取最后一行,则打印最终平均值。

    脚本仅考虑 1991 年到 1993 年之间的年份。如果您想包含更多年份,您可以复制计算行或使用 or 运算符添加多个年份 ||

    # calculate average
    /^01\/199[0-9]/ || /^01\/200[0-9]/ { sum+=$2; cnt++; }
    

    这考虑了所有 1990 年代和 2000 年代。

    如果您不想打印标题,请删除相应的行 print header

    你称这个 awk 脚本为

    awk -f script.awk myfile.txt
    

    【讨论】:

    • 谢谢,但我添加了一些编辑以帮助我思考解决方案。
    • 您好,谢谢。我该如何执行? ./yourscript 我的文件...?我收到错误第 5 行 /[a-zA-Z]/: No such file or directory and syntax error on line 6 near unexpected token `{' 以及第 6 行 if (cnt > 0) {'跨度>
    • 谢谢 - 它现在可以工作,但我的输入文件实际上是从 1991 年 1 月 (01) 到 2013 年 1 月 (01) 的 mm/yyyy 格式。我需要平均所有年份 (1991-2012 ) 除了最后一个 - 01/2013。非常感谢。
    • 谢谢 - 我想出了一个技巧来获得 1991-2012 年的平均值。再次感谢,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 2016-03-03
    • 1970-01-01
    相关资源
    最近更新 更多