Shell脚本实现:缺失数字的统计结果用0填充
统计日志第2列末尾数字的出现次数(含缺失数字0值)
需求说明
从日志文件中提取第2列的末尾数字,统计0-9每个数字的出现次数;当某个数字无对应记录时,必须将其统计值设为0。当前使用命令awk -F ',' '{print $2}' test.log|cut -c 10-10|sort|uniq -c无法实现缺失数字显示0的要求,需可行的Shell脚本方案。
输入示例日志
2022-11-17 05:00:02.327, MSG:86442, AppID:22 2022-11-17 05:00:14.143, MSG:81778, AppID:10 2022-11-17 05:00:16.365, MSG:81782, AppID:22 2022-11-17 05:00:25.010, MSG:82959, AppID:22 2022-11-17 05:00:40.852, MSG:58198, AppID:11 2022-11-17 05:00:45.104, MSG:89039, AppID:22 2022-11-17 05:01:00.618, MSG:34115, AppID:20 2022-11-17 05:01:02.927, MSG:81387, AppID:10 2022-11-17 05:01:04.826, MSG:82119, AppID:11 2022-11-17 05:01:04.926, MSG:82111, AppID:11 2022-11-17 05:01:04.945, MSG:82116, AppID:13 2022-11-17 05:01:00.618, MSG:59110, AppID:20
解决方案
方案1:单awk命令实现
直接用awk完成初始化统计数组、提取目标数字、遍历输出全0-9数字的统计结果,无需多命令拼接:
awk -F ',' '{ # 提取第2列的最后一个字符(末尾数字) digit = substr($2, length($2), 1) # 对应数字计数加1 count[digit]++ } END { # 遍历0-9,无记录则显示0 for (i=0; i<=9; i++) { print i, count[i]+0 } }' test.log
方案2:基于原有命令补全0值
如果想在原有命令基础上改造,可先统计已有数字的次数,再用循环补全缺失项:
# 统计已有数字的次数并保存到临时文件 awk -F ',' '{print substr($2, length($2), 1)}' test.log | sort | uniq -c | awk '{print $2, $1}' > temp_counts.txt # 遍历0-9,检查临时文件,无对应记录则输出0 for i in {0..9}; do grep -w "^$i" temp_counts.txt || echo "$i 0" done | sort -n # 清理临时文件 rm temp_counts.txt
输出示例
针对输入示例,执行方案1后的输出为:
0 1 1 1 2 2 3 0 4 0 5 1 6 1 7 1 8 2 9 3
内容的提问来源于stack exchange,提问作者F.Eliasius
相关产品推荐
相关产品推荐

