【问题标题】:How can I use gnuplot with awk in shell command line (-e swtich)如何在 shell 命令行中使用带有 awk 的 gnuplot(-e 开关)
【发布时间】:2019-08-17 12:18:13
【问题描述】:

我想在 shell 命令行中使用 gnuplotawk,如下所示。

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 中绘制它。

【问题讨论】:

    标签: linux shell awk gnuplot


    【解决方案1】:

    来自 Gnuplot 文档:

    命令行替换由用反引号括起来的系统命令指定。这个命令是 spawned 并且它产生的输出替换了命令行上的反引号文本

    来源:GnuPlot 5.0 documentation

    所以这可以很容易地在 gnuplot 本身中进行测试:

    gnuplot> `awk 'BEGIN{print "plot sin(x)"}'`
    

    如果您现在想在命令行中将其与-e 标志一起使用,它应该如下所示:

    $ gnuplot --persist -e "`awk 'BEGIN{print \"plot sin(x)\"}' ` "
    

    请注意,我们必须在 awk 命令中转义 。这是由于 bash 引用规则。如果您不想转义双引号,则必须使用单引号并再次转义。这将看起来像这样:

    $ gnuplot --persist -e '`awk '"'"'BEGIN{print "plot sin(x)"}'"'"' ` '
    

    如果你使用awk只是为了生成数据并且你想使用gnuplot的管道系统:

    在具有 popen 功能的系统上,可以通过启动文件来通过 shell 命令对数据文件进行管道传输 带有“

    pop(x) = 103*exp(-x/10)
    plot "< awk '{print $1-1965, $2}' population.dat", pop(x)
    

    来源:GnuPlot 5.0 documentation

    所以在 OP 的情况下,通过适当的转义,你会这样做:

    $ gnuplot --persist -e "plot \"< awk '/matchpattern/{print \$4}' log.txt \""
    

    请注意我还必须如何转义$,否则,bash 将用第 4 个 bash 参数替换它,该参数很可能是一个空字符串。

    【讨论】:

    • 非常感谢!!转义引号和 $ 是关键。我实际上正在使用 csh 并发现转义 $ 很不方便。此外,我需要将多个文件放入 awk,这意味着我需要使用通配符“*”。这使得命令更加复杂。我认为这超出了这个问题的范围。无论如何,您的答案在 bash 中非常有效。再次感谢!!!
    【解决方案2】:

    你只需要转义嵌套的双引号:

    gnuplot -persist -e "plot \" < awk '/matchpattern/ {print $4}' log.txt \" "
    

    如果你不这样做,你的 shell 将被解释为 gnuplot 的单独参数

    • -e "plot "
    • &lt; awk
    • '/matchpattern/ {print $4}'
    • log.txt

    shell 会错误地认为它应该从名为awk 的文件中重定向gnuplot 命令的标准输入。由于您的工作目录中不存在该文件,因此会引发错误:awk: No such file or directory.

    【讨论】:

    • 感谢您的好意。这次的错误信息是:Unmatched ".我的gnuplot版本是4.2 patchlevel 6。这有关系吗?
    • 这是我测试的。 gnuplot -persist -e "plot \" &lt; awk '/^JOB.*Time/ {print $4}' log.txt \" "
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多