在随时间变化的内存使用数据中,内存大小以字节为单位<megabytes>m
或<gigas>g
。如何告诉Gnuplot如果它看到<number>m
它应该将数字乘以1024 ^ 2和1024 ^ 3为g
后缀?
例:
0
360m
1.1g
谢谢!
当你要求改进时,你会去:
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
默默地丢弃
使用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)
。
如果你使用Windows,可以找到sed
here。
这就是我最终做的,基本上是类似解决方案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以外的其他单位,但没有时间。