Как я могу использовать gnuplot с awk в командной строке (-e swtich) - PullRequest
1 голос
/ 27 марта 2019

Я хотел бы использовать gnuplot с awk в командной строке оболочки, как показано ниже.

gnuplot -persist -e " plot '< awk_command' "

Моя awk команда

awk '/match_pattern/ {print $4}' log.txt

Я не могу найтикак обрабатывать кавычки внутри команды my 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 "

Я хочу нарисовать его в командной строке оболочки, а не в gnuplot просто для удобства.

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Из документации Gnuplot:

Подстановка командной строки задается системной командой, заключенной в кавычки. Эта команда порождается, и вывод, который он производит, заменяет текст в кавычках в командной строке

источник: Документация GnuPlot 5.0

Так что это легко проверить в самом 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 файл данных можно передать с помощью команды оболочки, запустив файл имя с ’<’. Например, </p>

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

источник: документация GnuPlot 5.0

Таким образом, в случае OP, с надлежащим побегом, вы должны сделать:

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

обратите внимание, как мне также пришлось экранировать $, иначе bash заменил бы его 4-м аргументом bash, который, скорее всего, является пустой строкой.

0 голосов
/ 27 марта 2019

Вам просто нужно избежать вложенных двойных кавычек:

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

Если вы этого не сделаете, ваша оболочка будет интерпретироваться как отдельные аргументы для gnuplot

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

и оболочка будет ошибочно думать, что она должна перенаправить стандартный ввод вашей команды gnuplot из файла с именем awk. Поскольку файл не существует в вашем рабочем каталоге, он выдает ошибку: awk: No such file or directory.

...