如何用AWK实现0-100数值的十位区间分布统计?
用AWK实现0-100数值按十位区间分组统计
现有一个包含100个0到100之间数值的列表,需按十位区间分组统计各区间的数值数量,示例如下:
10 number example: 4 2 22 1 2 2 3 33 84 84 cat numbers.txt|awk -f script.awk 0-9 : 5 10-19 : 0 20-29 : 1 30-39 : 1 40-49 : 0 50-59 : 0 60-69 : 0 70-79 : 0 80-89 : 2 90-99 : 0 100 : 0
实现方案
1. 编写AWK脚本(script.awk)
# 初始化所有区间计数为0 BEGIN { for (i = 0; i < 10; i++) { count[i] = 0 } count[10] = 0 # 单独处理100这个特殊值 } # 遍历每个输入数值并归类统计 { for (num = 1; num <= NF; num++) { val = $num if (val == 100) { count[10]++ } else { idx = int(val / 10) count[idx]++ } } } # 按格式输出统计结果 END { for (i = 0; i < 9; i++) { printf "%d-%d : %d\n", i*10, i*10+9, count[i] } printf "90-99 : %d\n", count[9] printf "100 : %d\n", count[10] }
2. 脚本说明
- BEGIN块:提前初始化所有区间的计数变量为0,其中
count[10]专门用于统计100的数量。 - 主处理块:遍历输入的每个数值,判断是否为100:
- 若是100,直接给
count[10]加1; - 若不是,通过
int(val/10)计算数值对应的区间索引(比如22除以10取整得2,对应20-29区间),给对应索引的计数加1。
- 若是100,直接给
- END块:按要求的格式依次输出每个十位区间的统计结果,最后单独输出100的计数。
3. 使用方式
将数值列表保存到numbers.txt(每行单个或多个数值均可),执行以下命令即可得到结果:
awk -f script.awk numbers.txt # 或通过管道读取输入 cat numbers.txt | awk -f script.awk
内容的提问来源于stack exchange,提问作者Bronix
相关产品推荐
相关产品推荐

