我想在外壳命令行中将gnuplot
与awk
一起使用,如下所示。
gnuplot -persist -e " plot '< awk_command' "
我的awk
命令是
awk '/match_pattern/ {print $4}' log.txt
我在awk命令中找不到如何处理引号。
gnuplot -persist -e "plot " < awk '/matchpattern/ {print $4}' log.txt " "
这产生了一条错误消息
awk: No such file or directory.
当我在gnuplot
中进行此操作时,没有问题。
gnuplot> plot " < awk '/matchpattern/ {print $4}' log.txt "
为了方便起见,我想在shell命令行中而不是在gnuplot中绘制它。
答案 0 :(得分:1)
从Gnuplot文档中:
命令行替换由反引号内的系统命令指定。该命令是 产生并产生的输出替换命令行上反引号的文本
因此,可以在gnuplot本身中轻松对其进行测试:
gnuplot> `awk 'BEGIN{print "plot sin(x)"}'`
如果您现在想在命令行中将其与-e
标志一起使用,它应该看起来像这样:
$ gnuplot --persist -e "`awk 'BEGIN{print \"plot sin(x)\"}' ` "
请注意,我们必须在awk命令中转义
$ gnuplot --persist -e '`awk '"'"'BEGIN{print "plot sin(x)"}'"'"' ` '
如果仅使用awk
来生成数据,而您想使用gnuplot的管道系统:
在具有popen功能的系统上,可以通过启动shell命令通过shell命令来传递数据文件 名称带有“ <”。例如,
pop(x) = 103*exp(-x/10) plot "< awk '{print $1-1965, $2}' population.dat", pop(x)
因此,如果是OP,请使用适当的转义符进行操作:
$ gnuplot --persist -e "plot \"< awk '/matchpattern/{print \$4}' log.txt \""
请注意我还必须转义$
的情况,否则bash会将其替换为第4个bash参数,该参数很可能是空字符串。
答案 1 :(得分:0)
您只需要转义嵌套的双引号即可:
gnuplot -persist -e "plot \" < awk '/matchpattern/ {print $4}' log.txt \" "
如果不这样做,您的外壳程序将被解释为gnuplot的单独参数
-e "plot "
< awk
'/matchpattern/ {print $4}'
log.txt
并且shell会错误地认为应该从名为gnuplot
的文件中重定向awk
命令的标准输入。由于该文件在您的工作目录中不存在,因此会引发错误:awk: No such file or directory.