gpt4 book ai didi

awk - 在gnuplot函数中使用awk或其他shell命令

转载 作者:行者123 更新时间:2023-12-03 14:47:10 25 4
gpt4 key购买 nike

我想要这样的东西:

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之后awk这个文件,但是我不想使用单独的文件。

最佳答案

$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)))

关于awk - 在gnuplot函数中使用awk或其他shell命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12846717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com