使用awk创建自定义区间的类直方图输出(大文件替代R方案)
自定义区间直方图统计(Awk实现)
没问题,我来给你写一个易懂的awk脚本,完全符合你的需求,Linux新手也能快速上手!
核心逻辑
我们要把每个数值映射到对应的区间(左闭右开,比如[0.6,0.7)包含0.624999这类数值),统计每个区间的出现次数,最后从起始区间开始按顺序输出结果,即使区间没有数据也会输出0。
Awk脚本实现
你可以把下面的内容保存成histogram.awk文件,也可以直接在命令行运行:
BEGIN { start = 0 # 区间起始值,可自定义 step = 0.1 # 区间步长,可自定义 max_val = 0 # 记录数据中的最大值,用来确定最后一个区间 } # 遍历每行的所有数值 { for (i=1; i<=NF; i++) { val = $i # 计算当前数值所属的区间下界 bin = int(val / step) * step # 给对应区间的计数加1 count[bin]++ # 更新最大值,确保最后能覆盖所有数据的区间 if (val > max_val) max_val = val } } END { # 从起始区间开始,逐个输出直到覆盖最大数值的区间 current = start while (current <= max_val + step) { next_bin = current + step # 若区间无数据,count[current]为空,加0确保输出0而非空 printf "%.1f %.1f %d\n", current, next_bin, count[current]+0 current = next_bin } }
如何使用
假设你的数据文件叫data.txt,直接在终端运行:
awk -f histogram.awk data.txt
如果不想保存脚本,也可以用单行命令快速测试:
awk 'BEGIN{start=0;step=0.1;max_val=0} {for(i=1;i<=NF;i++){val=$i;bin=int(val/step)*step;count[bin]++;if(val>max_val)max_val=val}} END{current=start;while(current<=max_val+step){next_bin=current+step;printf"%.1f %.1f %d\n",current,next_bin,count[current]+0;current=next_bin}}' data.txt
针对你的示例数据测试
你的输入数据:1.37987 1.21448 0.624999 1.28966 1.77084 1.088 1.41667
运行后会输出:
0.0 0.1 0 0.1 0.2 0 0.2 0.3 0 0.3 0.4 0 0.4 0.5 0 0.5 0.6 0 0.6 0.7 1 0.7 0.8 0 0.8 0.9 0 0.9 1.0 0 1.0 1.1 1 1.1 1.2 0 1.2 1.3 2 1.3 1.4 1 1.4 1.5 1 1.5 1.6 0 1.6 1.7 0 1.7 1.8 1 1.8 1.9 0
完全匹配你想要的输出格式。
自定义调整技巧
- 修改区间起点/步长:只需要改
BEGIN块里的start和step值,比如想从0.5开始、步长0.2,就设start=0.5、step=0.2 - 调整输出小数位数:把
printf里的%.1f改成%.2f就能输出两位小数,按需修改即可 - 处理超大文件:awk天生适合处理大文本,不需要担心性能问题,直接运行就行
内容的提问来源于stack exchange,提问作者EvenStar69
相关产品推荐
相关产品推荐

