Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gnuplot:如何解析带有单位后缀的输入数字(m/g表示兆字节/千兆字节)?_Gnuplot - Fatal编程技术网

gnuplot:如何解析带有单位后缀的输入数字(m/g表示兆字节/千兆字节)?

gnuplot:如何解析带有单位后缀的输入数字(m/g表示兆字节/千兆字节)?,gnuplot,Gnuplot,在随时间变化的内存使用数据中,内存大小以字节m或g为单位。如何告诉Gnuplot,如果它看到m,它应该将该数字乘以1024^2和1024^3作为g后缀 例如: 0 360m 1.1g 谢谢大家! 使用UNIX命令sed在新列中将这些字母替换为乘数 plot "< sed 's/\\([^kmg]\\)$/\\1 1/;s/k$/ 1024/;s/m$/ 1048576/;s/g$/ 1073741824/' data.dat" u ($1*$2) w lp notitle 然后,使用

在随时间变化的内存使用数据中,内存大小以字节m或g为单位。如何告诉Gnuplot,如果它看到m,它应该将该数字乘以1024^2和1024^3作为g后缀

例如:

0
360m
1.1g
谢谢大家!

使用UNIX命令sed在新列中将这些字母替换为乘数

 plot "< sed 's/\\([^kmg]\\)$/\\1 1/;s/k$/ 1024/;s/m$/ 1048576/;s/g$/ 1073741824/' data.dat" u ($1*$2) w lp notitle
然后,使用第一列和第二列的乘法绘制该数据:u$1*$2


如果您使用的是Windows,则可以找到sed。

这就是我最后所做的,本质上是一个类似解决方案的扩展请注意,带有单位标记的大小在我的数据的第2列中:

resolveUnit(u,mul,x)=(pos=strstrt(x,u), pos > 0 ? sprintf("%f",real(substr(x,1,pos - 1))*mul) : x)
resolveUnits(x)=(resolveUnit("g",1024*1024*1024,resolveUnit("m",1024*1024,x)))
check(x)=(real(resolveUnits(x)))
plot infile using 1:(check(stringcolumn(2)))
我相信这段代码可以改进很多。请毫不犹豫地发表评论:-


我想研究如何调整neat方法,以支持m和g以外的其他单位,但没有时间这样做。

当您要求改进时,下面是:

resolveUnit(s)=(pos=strstrt("kmgtp",s[strlen(s):*]), real(s)*(1024**pos))
print resolveUnit("123.0")
print resolveUnit("1k")
print resolveUnit("2m")
print resolveUnit("4g")

这使用单位后缀的位置作为1024的指数。在计算过程中,real悄悄地丢弃后缀,real'100k'=>100.0

谢谢,这是一种有趣的方法,比我最终的只使用gnuplot的解决方案更简单。谢谢分享!和蔼的❤️谢谢!获得最后一个角色的技巧非常巧妙。我不知道皇马会处理掉这个单位。真的很好很简单!另外,gnuplot在内部使用stdlib.h中的atof解析数字,并相应地进行操作。
resolveUnit(s)=(pos=strstrt("kmgtp",s[strlen(s):*]), real(s)*(1024**pos))
print resolveUnit("123.0")
print resolveUnit("1k")
print resolveUnit("2m")
print resolveUnit("4g")