Используя awk или другую команду оболочки внутри функции gnuplot
Мне нужно что-то вроде этого:
file1='logs/last/mydata1.log'
file2='logs/last/mydata2.log'
# declare function that uses awk to reshape the data - does not work :(
sum1(fname)=("<awk '{sum=0; for(i=8;i<=NF;i+=2) sum+=$i; print $1,sum/2}' $fname")
sum2(fname)=("<awk '{sum=0; for(i=9;i<=NF;i+=2) sum+=$i; print $1,sum/2}' $fname")
# plot different columns of my file and awk processed file
plot file1 u 1:2 title "thing A measure 1" w l, \
file1 u 3:4 title "thing A measure 2" w l, \
file2 u 1:2 title "thing B measure 1" w l, \
file2 u 3:4 title "thing B measure 2" w l, \
sum1(file1) u 1:2 title "group A measure 1" w l, \
sum2(file1) u 1:2 title "group A measure 2" w l, \
sum1(file2) u 1:2 title "group B measure 1" w l, \
sum2(file2) u 1:2 title "group B measure 2" w l
Что не работает, это часть с awk
внутри функции gnuplot.
Используя мой awk
script непосредственно после plot
отлично работает:
plot "<awk '{sum=0; for(i=9;i<=NF;i+=2) sum+=$i; print $1,sum}' ./logs/last/mydata1.log" u 1:2 w l
Есть ли способ поставить awk
или другие команды оболочки внутри функции gnuplot?
Я знаю, что могу передать awk script в другой файл и awk этот файл непосредственно после plot
, но я не хочу отдельных файлов.
Ответы
Ответ 1
$var
не расширяет var
в строке внутри gnuplot, как в оболочке. Вы хотите использовать конкатенацию строки gnuplot (которая использует оператор .
):
sum1(fname)="<awk '{sum=0; for(i=8;i<=NF;i+=2) sum+=$i; print $1,sum/2}' ".fname
Или, я полагаю, вы могли бы использовать sprintf
, если вы найдете это более удобным:
sum1(fname)=sprintf("<awk '{sum=0; for(i=8;i<=NF;i+=2) sum+=$i; print $1,sum/2}' %s",fname)
* Обратите внимание, что это фактически не выполняет команду. Он просто строит строку, которая будет передана plot
, а затем plot
выполнит команду. Если вы действительно хотите выполнить команду в функции, вы можете вызвать system
как функцию. Из документов:
`system "command"` executes "command" using the standard shell. See `shell`.
If called as a function, `system("command")` returns the resulting character
stream from stdout as a string. One optional trailing newline is ignored.
This can be used to import external functions into gnuplot scripts:
f(x) = real(system(sprintf("somecommand %f", x)))