使用 awk 类似直方图创建 bin

Eve*_*r69 1 unix bash awk grouping dataframe

这是我的输入文件:

1.37987
1.21448
0.624999
1.28966
1.77084
1.088
1.41667
Run Code Online (Sandbox Code Playgroud)

我想创建我选择的大小的垃圾箱以获得类似直方图的输出,例如对于 0.1 个垃圾箱,从 0 开始:

0 0.1 0
...
0.5 0.6 0
0.6 0.7 1
...
1.0 1.1 1
1.1 1.2 0
1.2 1.3 2
1.3 1.4 1
...
Run Code Online (Sandbox Code Playgroud)

我的文件对于 R 来说太大了,所以我正在寻找 awk 解决方案(也对我能理解的其他任何内容开放,因为我仍然是 Linux 初学者)。

这在这篇文章中已经得到了回答:awk histogram in buckets,但该解决方案对我不起作用。

Ed *_*ton 8

即使不完全正确,这也应该非常接近。至少将其视为一个起点,并自己验证/计算出数学(特别是决定/验证精确边界匹配0.2应该进入哪个桶 - 0.1 到 0.2 和/或 0.2 到 0.3?):

$ cat tst.awk
BEGIN { delta = (delta == "" ? 0.1 : 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
    }
}

$ awk -f tst.awk file
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
Run Code Online (Sandbox Code Playgroud)

请注意,您可以在命令行上指定存储桶增量大小,0.1 只是默认值:

$ awk -v delta='0.3' -f tst.awk file
0.0 0.3 0
0.3 0.6 0
0.6 0.9 1
0.9 1.2 1
1.2 1.5 4
1.5 1.8 1

$ awk -v delta='0.5' -f tst.awk file
0.0 0.5 0
0.5 1.0 1
1.0 1.5 5
1.5 2.0 1
Run Code Online (Sandbox Code Playgroud)