AWK脚本修改需求:分组统计结果换行输出及加号可视化
AWK数值分组统计脚本优化方案
原始脚本与当前输出
用于按区间统计第一列数值的原始AWK脚本:
{ if ($1 <= 9) xd++ else if ($1 > 9 && $1 <= 19) xd1++ else if ($1 > 19 && $1 <= 29) xd2++ else if ($1 > 29 && $1 <= 39) xd3++ else if ($1 > 39 && $1 <= 49) xd4++ else if ($1 > 49 && $1 <= 59) xd5++ else if ($1 > 59 && $1 <= 69) xd6++ else if ($1 > 69 && $1 <= 79) xd7++ else if ($1 > 79 && $1 <= 89) xd8++ else if ($1 > 89 && $1 <= 99) xd9++ else if ($1 == 100) xd10++ } END { print "0-9 : "xd, "10-19 : " xd1, "20-29 : " xd2, "30-39 : " xd3, "40-49 : " xd4, "50-59 : " xd5, "60-69 : " xd6, "70-79 : " xd7, "80-89 : " xd8, "90-99 : " xd9, "100 : " xd10 }
当前执行命令及输出:
$ cat xd1 | awk -f script.awk 0-9 : 16 10-19 : 4 20-29 : 30-39 : 2 40-49 : 1 50-59 : 1 60-69 : 1 70-79 : 1 80-89 : 1 90-99 : 1 100 : 2
需求说明
- 每个区间统计结果单独换行显示,示例:
0-9 : 16 10-19 : 4 20-29 : 30-39 : 2
- 在统计数值后添加对应数量的
+符号可视化数量,示例:
0-9 : 16 ++++++++++++++++ 10-19 : 4 ++++ 20-29 : 30-39 : 2 ++
优化后的脚本
针对需求优化后的AWK脚本:
{ if ($1 <= 9) cnt[0]++ else if ($1 <= 19) cnt[1]++ else if ($1 <= 29) cnt[2]++ else if ($1 <= 39) cnt[3]++ else if ($1 <= 49) cnt[4]++ else if ($1 <= 59) cnt[5]++ else if ($1 <= 69) cnt[6]++ else if ($1 <= 79) cnt[7]++ else if ($1 <= 89) cnt[8]++ else if ($1 <= 99) cnt[9]++ else if ($1 == 100) cnt[10]++ } END { # 定义区间标签与索引映射 labels["0-9"] = 0 labels["10-19"] = 1 labels["20-29"] = 2 labels["30-39"] = 3 labels["40-49"] = 4 labels["50-59"] = 5 labels["60-69"] = 6 labels["70-79"] = 7 labels["80-89"] = 8 labels["90-99"] = 9 labels["100"] = 10 # 遍历输出每个区间结果 for (label in labels) { idx = labels[label] count = cnt[idx] + 0 # 空值自动转为0 printf "%s : ", label if (count > 0) { printf "%d ", count # 生成对应数量的+符号 for (i=1; i<=count; i++) printf "+" } printf "\n" } }
关键优化点
- 换行实现:用
printf "\n"强制每个区间单独换行,替代原脚本中print拼接多字段的方式,解决换行失效问题。 - 可视化符号:通过循环生成与统计数等量的
+,统计数为0时不显示符号与数值,匹配需求示例。 - 代码简化:用数组
cnt存储各区间计数,labels映射区间名称与索引,避免大量独立变量,提升代码可维护性。
执行优化后的脚本,输出将完全符合需求:
0-9 : 16 ++++++++++++++++ 10-19 : 4 ++++ 20-29 : 30-39 : 2 ++ 40-49 : 1 + 50-59 : 1 + 60-69 : 1 + 70-79 : 1 + 80-89 : 1 + 90-99 : 1 + 100 : 2 ++
内容的提问来源于stack exchange,提问作者Bronix
相关产品推荐
相关产品推荐

