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

时间:2018-10-13 19:47:26

标签: gnuplot

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

示例:

0
360m
1.1g

谢谢!

3 个答案:

答案 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,则可以找到heresed

答案 1 :(得分: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以外的其他单元,但是没有时间。

答案 2 :(得分: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

静默丢弃