使用标题计算列数据的平均值

时间:2013-02-26 17:12:15

标签: awk

我有数据,例如:

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单行:

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

我得到的平均值,但不是我在1991年,1992年和1993年分别为每个遇见塔的平均值 非常感谢您的帮助!

1 个答案:

答案 0 :(得分: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年(含)。如果您想要包含更多年份,可以复制计算行或使用或运算符||

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

考虑到所有20世纪90年代和2000年代。

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

您将此awk脚本称为

awk -f script.awk myfile.txt