代码之家  ›  专栏  ›  技术社区  ›  Jakub Holý

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

  •  1
  • Jakub Holý  · 技术社区  · 7 年前

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

    例子:

    0
    360m
    1.1g
    

    谢谢您!

    3 回复  |  直到 7 年前
        1
  •  1
  •   Christoph    7 年前

    当你要求改进的时候,给你:

    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

        2
  •  2
  •   Michael    7 年前

    使用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, 塞德 可以找到 here .

        3
  •  1
  •   Jakub Holý    7 年前

    这就是我最后所做的,本质上是一个类似解决方案的扩展 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