3

例如,我有如下数据:

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

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

依此类推...因为输入文件充满了许多标题,其中包含如上所示的数据。

我试图做模式匹配选项,并使用类似这样的 NR 作为 awk 单线器没有成功:

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

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

4

1 回答 1

2

如果您只想考虑 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 年(包括 1991 年)。如果您想包含更多年份,您可以复制计算行或使用 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
于 2013-02-26T17:50:54.467 回答