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

问题描述 投票:1回答:3

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

例:

0
360m
1.1g

谢谢!

gnuplot
3个回答
1
投票

当你要求改进时,你会去:

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的指数。在计算过程中,后缀被realreal('100k') => 100.0默默地丢弃


2
投票

使用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

gnuplot处理的数据如下所示:

0 1
360 1048576
1.1 1073741824

然后使用第一列和第二列的乘法绘制该数据:u ($1*$2)

enter image description here

如果你使用Windows,可以找到sed here


1
投票

这就是我最终做的,基本上是类似解决方案posted earlier by F. Knorr的扩展(注意单位标记的大小在我的数据中的第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)))

我相信这段代码可以得到很多改进。不要犹豫评论:-)

我想调整this AWK solution的整齐方法来支持m和g以外的其他单位,但没有时间。

© www.soinside.com 2019 - 2024. All rights reserved.