AWK计算操作实践笔记
有列纯数字的文本(在之前可以通过各种手段过滤出只有数字这一列),比如它代表的是网站在线数,内容如下:
127809 16813 551646 18858 18977 29369 23563 56302 11823 20212 149427 146515一、求和
awk '{sum+=$1} END {print "Sum = ", sum}'二、求平均
awk '{sum+=$1} END {print "Average = ", sum/NR}'如果有浮点的话还需要 .2%之类格式支持 三、求最大值
awk 'BEGIN {max = 0} {if ($1>max) max=$1 fi} END {print "Max=", max}'四、求最小值(min的初始值设置一个超大数即可)
awk 'BEGIN {min = 2000000000} {if ($1五、案例分析 部分原始数据如下: 09:14:00.500 3279.20 5 3279.80 29 3279.80 73 28715 09:15:00.500 3279.00 14 3279.80 9 3279.80 134 28723 09:15:01.0 3279.00 11 3279.20 24 3279.20 155 28721 09:15:01.500 3279.00 3 3279.20 15 3279.20 172 28715 09:15:02.0 3278.20 7 3278.80 7 3279.20 190 28719 09:15:02.500 3278.20 2 3278.60 1 3278.80 205 28721 09:15:03.0 3278.40 1 3278.60 25 3278.60 215 28727 09:15:03.500 3278.00 88 3278.60 13 3278.60 236 28729 09:15:04.0 3278.00 88 3278.40 12 3278.20 239 28728 09:15:04.500 3278.20 2 3278.40 12 3278.20 255 28724 09:15:05.0 3278.00 78 3278.20 1 3278.00 268 28724 09:15:05.500 3278.00 71 3278.40 10 3278.20 279 28726 09:15:06.0 3278.00 65 3278.20 14 3278.00 288 28726 09:15:06.500 3278.00 58 3278.20 16 3278.00 295 28722 09:15:07.0 3278.00 48 3278.20 5 3278.20 317 28728 09:15:07.500 3278.00 44 3278.40 8 3278.00 337 28733 09:15:08.0 3278.00 39 3278.40 8 3278.00 344 28727 09:15:08.500 3278.20 1 3278.40 7 3278.20 351 28729 09:15:09.0 3278.20 1 3278.40 5 3278.20 361 28726 09:15:09.500 3278.00 29 3278.40 4 3278.20 368 28726第一步已经实现了对原始数据每分钟最大值、最小值、平均值的统计。我把第一次统计后的数据列出来:09:19 3297.80 3296.00 3296.8 09:20 3299.00 3296.60 3297.8 09:21 3298.40 3296.20 3296.9 09:22 3299.80 3297.20 3298.4 09:23 3299.20 3296.20 3298.3 09:24 3299.00 3297.20 3298.1$1: 时间, $2: 分钟最大值, $3: 分钟最小值, $4: 分钟平均值 以上数据通过如下方式实现的:#!/bin/sh srcpath=./src/ despath=./des/ for file in $(ls -1 -F ${srcpath} | grep -v [/$]);do # 第一步:处理原始数据 # 通过substr来截取时间字段的[小时:分钟] # 处理后的数据格式为 time max min arg ;共4个字段 # 最后把统计后的数据保存至目标临时文件 # 使用了三元运算符 awk '{ time=substr($1,1,5) count[time]++ max[time]=$6>max[time]?$6:max[time] min[time]=(!length(min[time])||$6说明:把以上数据做个累计最大值和累计最小值统计。 初始化统计的时候,累计最值和每分钟最值是一样的. 要求输出如下格式数据:[time])?$6:min[time] sum[time]+=$6 } END{ for(i in count) { print i,max,min,sum/count } }' ${srcpath}${file}|sort> ${despath}${file}_tmp done 09:19 3297.80 3296.00 3296.8 3297.80 3296.00 09:20 3299.00 3296.60 3297.8 3299.00 3296.00 09:21 3298.40 3296.20 3296.9 3299.00 3296.00 09:22 3299.80 3297.20 3298.4 3299.80 3296.00 09:23 3299.20 3296.20 3298.3 3299.80 3296.00 09:24 3299.00 3297.20 3298.1 3299.80 3296.00