linux – 2d直方图制作

linux – 2d直方图制作,第1张

概述我有一个包含两列的数据文件,比如 1.1 2.23.1 4.51.2 4.53.2 4.61.1 2.34.2 4.94.2 1.1 我想从两列做一个直方图,即得到这个输出(如果步长(或者我们在谈论直方图时的bin大小)等于0.1) 1.0 1.0 01.0 1.1 01.0 1.2 0...1.1 1.0 01.1 1.1 01.1 1.2 0...1.1 2.0 0 我有一个包含两列的数据文件,比如

1.1 2.23.1 4.51.2 4.53.2 4.61.1 2.34.2 4.94.2 1.1

我想从两列做一个直方图,即得到这个输出(如果步长(或者我们在谈论直方图时的bin大小)等于0.1)

1.0 1.0 01.0 1.1 01.0 1.2 0...1.1 1.0 01.1 1.1 01.1 1.2 0...1.1 2.0 01.1 2.1 01.1 2.2 1......

有人可以给我一些建议吗?如果我可以设置colmuns的值范围,那就太好了.在上述情况下,第1列值从1到4,与第2列相同.

已编辑:已更新以处理更多常规数据输入,例如浮点数.上述情况下的步长为0.1,但如果它可以为其他设置调谐,即如果步长范围(箱尺寸)例如是0.2或1.0,则会很好.
如果步长是例如1.0,那么如果我有1.1和1.8他们有相同的bin,我们必须一起处理它们(例如,在这种情况下的范围让我们说两个列0.0的两个. .4.0)

1.1 1.82.5 2.61.4 2.11.3 1.53.3 4.03.8 3.94.0 3.24.0 4.0

输出(如果bin大小= 1.0)

1 1 21 2 11 3 01 4 02 1 02 2 12 3 02 4 03 1 03 2 03 3 13 4 14 1 04 2 04 3 14 4 1
解决方法
awk 'END {  for (i = 0; ++i <= l;) {    for (j = 0; ++j <= l;)      printf "%d %d %d %s\n",i,j,\        b[i,j],(j < l ? x : ORS)     }  }{  f[NR] = ; s[NR] =   b[,]++  }' l=4 infile

您可以试试这个(未经过全面测试):

awk -v l=4 -v bs=0.1 'BEGIN {  if (!bs) {      print "invalID bin size" > "/dev/stderr"   exit    }  split(bs,t,".")  t[2] || fL++  m = "%." length(t[2]) "f"   }{  fk = fl ? int() : sprintf(m,)  sk = fl ? int() : sprintf(m,)  f[fk]; s[sk]; b[fk,sk]++  }END {  if (!bs) exit 1  for (i = 1; int(i) <= l; i += bs) {    for (j = 1; int(j) <= l; j += bs) {      if (fl) {        fk = int(i); sk = int(j); m = "%d"        }      else {        fk = sprintf(m,i); sk = sprintf(m,j)        }           printf "%s" m OFS m OFS "%d\n",(i > 1 && fk != p ? ORS : x),fk,sk,b[fk,sk]      p = fk              }    }  }'  infile
总结

以上是内存溢出为你收集整理的linux – 2d直方图制作全部内容,希望文章能够帮你解决linux – 2d直方图制作所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/1018455.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存