gnuplot: как разобрать входные числа с суффиксами единиц (м / г для мегабайт / гигабайт)? - PullRequest
0 голосов
/ 13 октября 2018

В данных об использовании памяти с течением времени объем памяти указывается в байтах <megabytes>m или <gigas>g.Как сказать Gnuplot, что если он видит <number>m, он должен умножить число на 1024 ^ 2 и 1024 ^ 3 для суффикса g?

Пример:

0
360m
1.1g

Спасибо!

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Это то, что я в итоге сделал, по сути, расширение аналогичного решения , опубликованного ранее Ф. Кнорром (обратите внимание, что размеры с маркерами единиц указаны в столбце 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)))

Я уверен, что этот код можно значительно улучшить.Не стесняйтесь комментировать: -)

Я хотел бы взглянуть на адаптацию аккуратного подхода из этого решения AWK для поддержки других единиц, кроме m и g, но у него не будет времени начто.

0 голосов
/ 15 октября 2018

Как вы просили об улучшениях, здесь вы идете:

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

0 голосов
/ 14 октября 2018

Используйте команду 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 может бытьнайдено здесь .

...