具体文件格式如下:
2022-7-1 00:01:01 78
2022-7-1 00:01:04 89
2022-7-1 00:03:01 178
2022-7-1 00:03:05 890
2022-7-2 00:03:01 178
2022-7-3 00:03:05 890
...
2022-7-30 00:03:01 178
2022-7-31 00:07:05 8900解题思路:设置三重for循环,在awk中设置三个变量来接收shell中的变量,因为需要使用进行正则匹配在求和。
# 清空两个文件,log.txt为临时保存最后结果的文件,log1.txt为保存最后结果的文件
>log.txt
>log1.txt
# 对每一天的每一小时的每一分钟进行for循环
for day in {1..31}
do
for hour in {00..23}
do
for minute in {00..59}
do
cat flow.txt|awk -v aday="$day" -v ahour="$hour" -v aminute="$minute" 'BEGIN{sum=0}$1=="2022-7-"aday && $2~ahour":"aminute":"{num+=$3}END{print num}' >log.txt
done
done
done
# 删掉空行
egrep -v "^$" log.txt >> log1.txt
上述代码是必须要掌握的,掌握以后我们要进一步了解其时间复杂度,这个算法的运算时间大概3min左右,而进一步改进的算法(如下),其运算时间不到1s
awk '{time[$1,substr($1,5,1)substr($2,1,5)]+=$3}END{for (i in time)print i,time[i]}' flow.txt