1.已提取出一列数处理
假设data.txt文件有一列数
求平均值,总和除以行数
awk '{sum += $1} END {printf "NR = %d,Average = %3.3f\n",NR,sum/NR}' data.txt
求最大值,初始值给0,找到更大的数替换
awk 'BEGIN{ max = 0} {if ($1 > max) max = $1; fi} END{printf "Max = %.1f\n",max}' data
求最小值,初始值给一个较大的数,找到更小的数替换
awk 'BEGIN{min = 65535} {if ($1 < min) min = $1;fi} END{printf "Min = %.1f\n",min}' data
参考资料:
shell脚本之awk命令——按列求平均值、最大值、最小值 https://blog.csdn.net/xb_2015/article/details/120050869
考虑一个性能测试环境,要保证每周期数据及时处理,则需要统计该路径下所有统计文件中记录的Decoder模块每个周期的处理时长(Decoder-Duration)的平均值、最大值、和最小值
Statistics_<yyyymmddHHMMSS>.txt 文件内容样式如下
# Decoder-ROP,Decoder-Duration,CPU%
Decoder-202304251315,6.85,18.65%
# Reporter-ROP,Reporter-Duration,CPU%
Reporter-202304251315,6.80,5.45%
分析步骤如下:
(1)找出对应的行
[root@xxx Report]# grep Decoder- ./Statistics*.txt | grep -v Decoder-ROP | head -4
./Statistics_202304230900.txt: Decoder-202304230900,6.97,18.99%
./Statistics_202304230915.txt: Decoder-202304230915,6.87,18.81%
./Statistics_202304230930.txt: Decoder-202304230930,6.89,18.87%
./Statistics_202304230945.txt: Decoder-202304230945,6.86,18.73%
(2)取出空格分隔的第二段
[root@xxx Report]# grep Decoder- ./Statistics*.txt | grep -v Decoder-ROP | awk '{print $2}' | head -4
Decoder-202304230900,6.97,18.99%
Decoder-202304230915,6.87,18.81%
Decoder-202304230930,6.89,18.87%
Decoder-202304230945,6.86,18.73%
(3)取出逗号分隔的第二段(-F, #指定分隔符为逗号)
[root@xxx Report]# grep Decoder- ./Statistics*.txt | grep -v Decoder-ROP | awk '{print $2}' | awk -F, '{print $2}' | head -4
6.97
6.87
6.89
6.86
(4) 计算平均值、最大值、最小值
平均值
[root@xxx Report]# grep Decoder- ./Statistics*.txt | grep -v Decoder-ROP | awk '{print $2}' | awk -F, '{print $2}' | awk '{sum += $1} END {printf "NR = %d,Average = %3.2f\n",NR,sum/NR}'
NR = 312,Average = 6.90
最大值
[root@xxx Report]# grep Decoder- ./Statistics*.txt | grep -v Decoder-ROP | awk '{print $2}' | awk -F, '{print $2}' | awk 'BEGIN{ max = 0} {if ($1 > max) max = $1; fi} END{printf "Max = %.1f\n",max}'
Max = 9.8
最小值
[root@xxx Report]# grep Decoder- ./Statistics*.txt | grep -v Decoder-ROP | awk '{print $2}' | awk -F, '{print $2}' | awk 'BEGIN{min = 65535} {if ($1 < min) min = $1;fi} END{printf "Min = %.1f\n",min}'
Min = 3.9
2.数据文件包含多列数
只要把上述的 $1(第一列) 换成对应的列号即可,考虑以下文件 test.txt
1727,908,1327,4646407,5.38%
1610,908,1335,4673779,5.41%
1580,908,1319,4619004,5.35%
1638,908,1323,4631397,5.36%
1719,908,1322,4628677,5.36%
1685,908,1329,4654044,5.39%
1707,908,1326,4643499,5.37%
1985,908,1328,4651098,5.38%
1993,908,1331,4659000,5.39%
1679,908,1333,4667734,5.40%
1777,908,1338,4683686,5.42%
1865,908,1328,4651117,5.38%
现在求第4列的最大值
[root@mr32 Report]# awk -F, 'BEGIN {max = 0} {if ($4 > max) max=$4} END {print "Max=", max}' test.txt
Max= 4683686