计算平均
问题描述:
我已看起来像这样,例如数据:计算平均
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
等等... SI输入文件中充满了许多包含上述数据的标题。
我试图做模式匹配的选择和使用NR像这样的东西没有成功作为一个awk一行代码:
awk '/01/1991,/01/1993 {sum+=$2; cnt+=1} {print "Avg =" sum/cnt}' myfile.txt
我得到的平均值,但不是我想要的只是岁月1991年,1992年平均和1993年分别为每个会议塔。
非常感谢您的帮助!
答
如果你想只考虑几年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年代和21世纪初考虑。
如果您不想打印标题,请删除相应的行print header
。
你叫这个awk脚本作为
awk -f script.awk myfile.txt
感谢,但我增加了一些修改,以帮助我认为一个解决方案。 – user2100039 2013-02-26 18:31:14
@ user2100039我更新了脚本,请参阅,如果它符合您的需要。 – 2013-02-26 18:42:02
你好,谢谢。我如何执行此操作? ./yourscript myfile ...?我得到一个错误行5/[a-zA-Z] /:没有这样的文件或目录和语法错误在第6行附近意外的标记'{',并且在第6行if(cnt> 0){' – user2100039 2013-02-26 19:20:18