首页 > 解决方案 > 创建包含总数和百分比的 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

解决方案


您的预期输出似乎与您的示例输入数据不对应,但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 中有多少行的计数。加上对输出格式的一些调整,以更好地匹配您想要的输出。


推荐阅读