You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:25:23