我想要这样的事情:
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
什么不起作用是在gnuplot函数中有awk
的部分。
在awk
正常工作后直接使用我的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
或其他shell命令放入gnuplot函数中?
我知道我可以将awk脚本外包给另一个文件并在plot
后直接写入该文件,但我不想要单独的文件。
答案 0 :(得分:23)
$var
不会像在shell中那样在gnuplot中的字符串中展开var
。您想使用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)))