awk - 创建包含总数和百分比的 bin
问题描述
我想创建箱以获取包含总数和百分比的直方图,例如从 0 开始。
如果可能的话,在垃圾箱中设置最小值和最大值(在我的情况下值 min=0 和 max=20 )
输入文件
8 5
10 1
11 4
12 4
12 4
13 5
16 7
18 9
16 9
17 7
18 5
19 5
20 1
21 7
所需的输出
0 0 0.0%
0 - 2 0 0.0%
2 - 4 0 0.0%
4 - 6 0 0.0%
6 - 8 0 0.0%
8 - 10 5 6.8%
10 - 12 5 6.8%
12 - 14 13 17.8%
14 - 16 0 0.0%
16 - 18 23 31.5%
18 - 20 19 26.0%
> 20 8 11.0%
---------------------
Total: 73
我使用 Ed Morton 先生的这段代码,它工作得很好,但错过了百分比。
awk 'BEGIN { delta = (delta == "" ? 2 : delta) }
{
bucketNr = int(($0+delta) / delta)
cnt[bucketNr]++
numBuckets = (numBuckets > bucketNr ? numBuckets : bucketNr)
}
END {
for (bucketNr=1; bucketNr<=numBuckets; bucketNr++) {
end = beg + delta
printf "%0.1f %0.1f %d\n", beg, end, cnt[bucketNr]
beg = end
}
}' file
提前致谢
解决方案
您的预期输出似乎与您的示例输入数据不对应,但awk
请在您的问题中尝试该代码的这种变体(旨在放入可执行文件中以作为脚本运行,而不是由于大小而单行):
#!/usr/bin/awk -f
BEGIN { delta = (delta == "" ? 2 : delta) }
{
bucketNr = int(($0+delta) / delta)
cnt[bucketNr]++
max[bucketNr] = max[bucketNr] < $2 ? $2 : max[bucketNr]
sum += $2
numBuckets = (numBuckets > bucketNr ? numBuckets : bucketNr)
}
END {
for (bucketNr=1; bucketNr<=numBuckets; bucketNr++) {
end = beg + delta
printf "%d-%d %d %.1f\n", beg, end, max[bucketNr],
(cnt[bucketNr] / NR) * 100
beg = end
}
print "-------------"
print "Total " sum
}
它为第一列所在的每个 bin 添加跟踪第二列的最大值,并打印出一个百分比而不是每个 bin 中有多少行的计数。加上对输出格式的一些调整,以更好地匹配您想要的输出。
推荐阅读
- c++ - Arduino .read() 函数干扰 BLE 连接
- lua - “尝试将数字与零进行比较”错误
- sql - 根据一列值不运行序列
- xml - 为 AWS Glue 配置 XML 爬虫
- floating - 我正在尝试显示浮动活动并且它正在工作,但问题出现在 API 24 以下
- php - Magento 2 rest API:为制造商创建和关联选择属性选项值到产品
- scala - breakOut 的转换 - 使用迭代器还是视图?
- python - 将函数应用于 Dataframe 列
- apache-spark - 结构化流 + Kafka 集成中的 PySpark 错误异常(60000 毫秒后元数据中不存在主题)
- azure - Azure 数据资源管理器:如何使用流引入从表中备份数据