我有数据,例如:
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年分别为每个遇见塔的平均值 非常感谢您的帮助!
答案 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