如何基于用户自定义分箱计算数值出现次数
自定义分箱统计数值出现次数的实现方案
直接用awk完成过滤、数值清洗、分箱计数、格式化输出全流程,替代原有的多管道命令,逻辑更紧凑准确:
完整命令
grep -i 'VIO' "$FILE" | awk ' BEGIN { # 初始化所有分箱的计数为0 bin_counts["-1.0"] = 0 bin_counts["-1.0 to -2.0"] = 0 bin_counts["-2.1 to -3.0"] = 0 bin_counts["-3.1 to -4.0"] = 0 bin_counts["-4.0"] = 0 } # 处理每行数据:提取第5列,去掉末尾的xx后缀转成数值 $5 ~ /-?[0-9]+\.[0-9]+xx/ { val = substr($5, 1, length($5)-2) # 匹配分箱规则,更新计数 if (val > -1.0) { bin_counts["-1.0"]++ } else if (val >= -2.0 && val <= -1.0) { bin_counts["-1.0 to -2.0"]++ } else if (val >= -3.0 && val <= -2.1) { bin_counts["-2.1 to -3.0"]++ } else if (val >= -4.0 && val <= -3.1) { bin_counts["-3.1 to -4.0"]++ } else if (val < -4.0) { bin_counts["-4.0"]++ } } # 处理完所有行后,按指定格式输出统计结果 END { printf "%-15s %d\n", "-1.0", bin_counts["-1.0"] printf "%-15s %d\n", "-1.0 to -2.0", bin_counts["-1.0 to -2.0"] printf "%-15s %d\n", "-2.1 to -3.0", bin_counts["-2.1 to -3.0"] printf "%-15s %d\n", "-3.1 to -4.0", bin_counts["-3.1 to -4.0"] printf "%-15s %d\n", "-4.0", bin_counts["-4.0"] }'
关键细节说明
- 数值清洗:用
substr($5, 1, length($5)-2)去掉原始数值末尾的xx后缀,将字符串转为可比较的浮点数。 - 分箱逻辑匹配:
-1.0:匹配大于-1.0的数值(对应示例中的-0.8xx)-1.0 to -2.0:匹配[-2.0, -1.0]区间的数值(对应-1.3xx、-1.2xx、-1.4xx,共3个)-2.1 to -3.0:匹配[-3.0, -2.1]区间的数值(对应-2.2xx)-3.1 to -4.0:匹配[-4.0, -3.1]区间的数值(对应-3.4xx)-4.0:匹配小于-4.0的数值(对应-4.2xx、-5.3xx,共2个)
- 格式化输出:用
%-15s保证分箱描述左对齐且宽度统一,和要求的输出格式完全一致。
测试验证
用提供的测试数值列表执行该命令,输出结果如下:
-1.0 1 -1.0 to -2.0 3 -2.1 to -3.0 1 -3.1 to -4.0 1 -4.0 2
内容的提问来源于stack exchange,提问作者jenniel
相关产品推荐
相关产品推荐

