Datamash 1.7 在浮点值装箱时输出零

Datamash 1.7 outputs zero on floating point values binning

我在 Centos 7.7 Linux x86_64 机器上使用 Datamash 1.7 对大小为 24 GB 的数据进行排序和分类。输入数据如下所示(仅前 50 个样本)

Ind_poob
0.040618
0.006233
0.004652
0.003559
0.001752
0.001605
0.007701
0.004722
0.029899
0.00104
0.014031
6.1e-5
0.002144
0.002385
0.001145
0
0.001463
0
0.003414
0
0.001602
9.75e-4
0.007218
6.4e-5
0.006426
0
7.2e-5
1.13e-4
1.5e-4
0
4.19e-4
0.009325
7e-5
0.006592
0.01
0
0.001605
0.001924
0.003714
0.00335
0.001876
5.52e-4
0
0.019234
0.001415
1e-5
0
0.004304
2.15e-4

期望输出(放大后)

#number  bin_number
4061.8  4061.8
623.3   620.00
465.2   460.00
355.9   350.00
175.2   170.00
160.5   160.00
770.1   770.00
472.2   470.00
2989.9  2980.00
104 100.00
1403.1  1400.00
6.1 0.00
214.4   210.00
238.5   230.00
114.5   110.00
0   0.00
146.3   140.00
0   0.00
341.4   340.00
0   0.00
160.2   160.00
97.5    90.00
721.8   720.00
6.4 0.00
642.6   640.00
0   0.00
7.2 0.00
11.3    10.00
15  10.00
0   0.00
41.9    40.00
932.5   930.00
7   0.00
659.2   650.00
1000    1000.00
0   0.00
160.5   160.00
192.4   190.00
371.4   370.00
335 330.00
187.6   180.00
55.2    50.00
0   0.00
1923.4  1920.00
141.5   140.00
1   0.00
0   0.00
430.4   430.00
21.5    20.00

但使用 Datamash 命令:datamash -H --format=%.8f -s bin 1 <test_data.txt,我得到

bin(ind_poob)
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000
0.00000000

如何格式化 datamash 命令以使用正确的浮点格式对输入数据进行排序和分类?其次,考虑到原始输入的大小为 24 GB,是否可以在使用 Gnuplot 合并后绘制它?

查看源代码(不幸的是,文档中没有很好地描述分箱),数字分箱是通过以下代码完成的:

const long double val = num_value / op->params.bin_bucket_size;
modfl (val, & op->value);
/* signbit will take care of negative-zero as well. */
if (signbit (op->value))
  --op->value;
op->value *= op->params.bin_bucket_size;

基本上,它将数字除以桶大小(默认值为 100)的整数部分,然后乘以桶大小。因此,由于样本数据中的所有数字都在 [0,1) 范围内,每个数字都在同一个 0 桶中。

您可以尝试通过将数据乘以 1e4(或更多)来缩放数据,看看这是否会给您更好的数字(此外,无需对数据进行排序 - 您可以省略 -s选项)。

另一种方法是将值视为字符串而不是数字,并使用 strbin,它使用可能更适合您的不同算法:

$ datamash -H --full strbin:100 1 < test_data.txt
Ind_poob        strbin(Ind_poob)
0.040618        60
0.006233        27
0.004652        70
0.003559        5
0.001752        30
0.001605        29
0.007701        37
0.004722        78
0.029899        25
0.00104 60
0.014031        17
6.1e-5  93
0.002144        84
0.002385        21
0.001145        57
...