如何在命令行使用awk按日期汇总OK与KO的累计数值
用awk按日期汇总OK/KO数值
需求说明
现有如下格式的日志数据,需要按日期汇总每日的OK和KO总数:
date numbersofOK numbersofKO's
2022/09/27::15:39:00 OK's=8 KO's=15
2022/09/27::16:38:52 OK's=8 KO's=12
2022/09/28::23:37:33 OK's=0 KO's=0
2022/09/28::00:37:22 OK's=1 KO's=2
期望得到按日期分组的汇总结果(注:原始数据中2022/09/28的OK总数实际为1,示例中写的4应为笔误):
date numbers of OK numbers of KO's
2022/09/27 16 27
2022/09/28 1 2
解决方案
可以用以下awk命令实现汇总:
方式1:编写awk脚本文件
创建脚本文件sum_ok_ko.awk,内容如下:
BEGIN { # 输出对齐格式的表头 printf "%-12s %-16s %-16s\n", "date", "numbers of OK", "numbers of KO's" } # 跳过原始数据的第一行表头,处理数据行 NR > 1 { # 提取日期:将第一列按"::"分割,取前半部分 split($1, date_arr, "::") curr_date = date_arr[1] # 提取OK数值:去掉"OK's="前缀 ok_val = substr($2, 5) # 提取KO数值:去掉"KO's="前缀 ko_val = substr($3, 5) # 按日期累加对应数值 total_ok[curr_date] += ok_val total_ko[curr_date] += ko_val } END { # 遍历所有日期,输出汇总结果 for (date in total_ok) { printf "%-12s %-16d %-16d\n", date, total_ok[date], total_ko[date] } }
运行命令(假设数据文件为data.log):
awk -f sum_ok_ko.awk data.log
方式2:单行命令直接运行
如果不想单独写脚本文件,可直接执行单行命令:
awk 'BEGIN{printf "%-12s %-16s %-16s\n", "date", "numbers of OK", "numbers of KO'\''s"} NR>1{split($1,d,"::"); ok=substr($2,5); ko=substr($3,5); total_ok[d[1]]+=ok; total_ko[d[1]]+=ko} END{for(d in total_ok) printf "%-12s %-16d %-16d\n", d, total_ok[d], total_ko[d]}' data.log
运行结果
执行后会输出:
date numbers of OK numbers of KO's 2022/09/27 16 27 2022/09/28 1 2
内容的提问来源于stack exchange,提问作者didisan
相关产品推荐
相关产品推荐

