2013-02-26 281 views
2

我已看起来像这样,例如数据:计算平均

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年分别为每个会议塔。
非常感谢您的帮助!

回答

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年代和21世纪初考虑。

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

你叫这个awk脚本作为

awk -f script.awk myfile.txt 
+0

感谢,但我增加了一些修改,以帮助我认为一个解决方案。 – user2100039 2013-02-26 18:31:14

+0

@ user2100039我更新了脚本,请参阅,如果它符合您的需要。 – 2013-02-26 18:42:02

+0

你好,谢谢。我如何执行此操作? ./yourscript myfile ...?我得到一个错误行5/[a-zA-Z] /:没有这样的文件或目录和语法错误在第6行附近意外的标记'{',并且在第6行if(cnt> 0){' – user2100039 2013-02-26 19:20:18