awk或sed命令求平均值和峰值

时间:2019-03-13 13:00:19

标签: shell unix awk sed

我想计算一小时内第三列的平均值和峰值(在第二列中提及)。请帮助解决。

27022019    2:00:01   3 
27022019    2:05:01   14
27022019    2:10:01   12
27022019    2:15:01   22
27022019    2:20:01   12
27022019    2:25:01   13
27022019    2:30:01   13
27022019    2:35:02   13
27022019    2:40:01   13
27022019    2:45:01   12
27022019    2:50:01   13
27022019    2:55:01   12

基于一个输入,我成功计算了一个小时的平均值和峰值(第二列中给出了2-3小时)。

$ awk '$2 ~ /^02:/' test.txt \
  | awk '{sum+=$3;max=(max>$3?max:$3)} 
         END{print "Between Hrs 2-3" " " "avg="sum/FNR " " "Max="max}' 
Between Hrs 2-3 avg=12.6667 Max=22 

但是当我将其放入for循环时,它给出了如下错误:

for i in 02: 
do 
awk '$2 ~ /^$i/' test.txt | awk '{sum+=$3;max=(max>$3?max:$3)} END{print "Between Hrs 2-3" " " "avg="sum/FNR " " "Max="max}'
done 
awk: 0602-566 Cannot divide by zero. 
The source line number is 1.

2 个答案:

答案 0 :(得分:0)

$2 ~ /^$i/永远都不是真的,因此第一个awk命令不能产生任何输出,因此您的第二个脚本的END部分中的FNR始终为0,因此除以零误差。

有关在awk脚本中访问shell变量的值的各种方法,请参见http://cfajohnson.com/shell/cus-faq-2.html#Q24,但在您的代码中,您可以这样做:

awk -v i="$i" '$2 ~ ("^"i)'`

答案 1 :(得分:0)

$ awk 'BEGIN {
    FS="( +|:)"
}
{                                           # $2==2 {  # to limit to an hour
    s[$2]+=$NF                              # sum the values
    c[$2]++                                 # count the values
    p[$2]=(p[$2]==""||p[$2]<$NF?$NF:p[$2])  # get peak val
}
END {
    for(i in s)                             # for all entries
        print i,s[i]/c[i],p[i]              # print hour, average and peak
}' file

输出:

2 12.4167 22