我想计算一小时内第三列的平均值和峰值(在第二列中提及)。请帮助解决。
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.
答案 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