gnuplot:如何解析带有单位后缀的输入数字(m/g表示兆字节/千兆字节)?
在随时间变化的内存使用数据中,内存大小以字节m或g为单位。如何告诉Gnuplot,如果它看到m,它应该将该数字乘以1024^2和1024^3作为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 然后,使用
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")