gpt4 book ai didi

bash - 在 bash 中创建直方图

转载 作者:行者123 更新时间:2023-12-03 22:50:28 24 4
gpt4 key购买 nike

编辑

我读过这个问题,这应该是 (this one) 的副本。我不同意。在那个问题中,目的是获得列中各个数字的频率。但是,如果我将该解决方案应用于我的问题,我仍然会遇到将特定范围内数字的频率分组到最终直方图的初始问题。即,如果该解决方案告诉我 0.45 的频率是 2 并且 0.441 (对于我的输入数据),我仍然面临将这两个频率分组为 3 范围内 0.4-0.5 的问题。

结束编辑

问题-

我有一长列数据,其值介于 0 和 1 之间。
这将是类型-

0.34
0.45
0.44
0.12
0.45
0.98
.
.
.

允许重复的一长列十进制值。

我正在尝试将其更改为直方图类型的输出,例如(对于上面显示的输入)-
0.0-0.1  0
0.1-0.2 1
0.2-0.3 0
0.3-0.4 1
0.4-0.5 3
0.5-0.6 0
0.6-0.7 0
0.7-0.8 0
0.8-0.9 0
0.9-1.0 1

基本上,第一列具有每个范围的下限和上限,第二列具有该范围内的条目数。

我把它(糟糕地)写成——
for i in $(seq 0 0.1 0.9)
do
awk -v var=$i '{if ($1 > var && $1 < var+0.1 ) print $1}' input | wc -l;
done

它基本上对它在每个范围内找到的条目进行 wc -l

输出格式不是问题的一部分。如果我只是得到对应于不同 bin 的频率,那就足够了。另请注意,bin 大小应该是一个变量,就像我提出的解决方案一样。

我已经阅读了 this 答案并希望避免循环。我确信 awk 中有一种更快的方法可以绕过 for 循环。你能帮我一下吗?

最佳答案

遵循与我之前的答案相同的算法,我在 awk 中编写了一个非常快的脚本(看图片)。
enter image description here
脚本如下:

#!/usr/bin/awk -f

BEGIN{
bin_width=0.1;

}
{
bin=int(($1-0.0001)/bin_width);
if( bin in hist){
hist[bin]+=1
}else{
hist[bin]=1
}
}
END{
for (h in hist)
printf " * > %2.2f -> %i \n", h*bin_width, hist[h]
}

bin_width 是每个 channel 的宽度。要使用脚本,只需将其复制到文件中,使其可执行(使用 chmod +x <namefile> )并使用 ./<namefile> <name_of_data_file> 运行它。

关于bash - 在 bash 中创建直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39614454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com