Как передать аргумент командной строки в gnuplot?
Я хочу использовать gnuplot для рисования рисунок из файла данных, скажем фу.данные. В настоящее время я жестко закодировал имя файла данных в командном файле, скажем фу.plt, и выполнить команду gnuplot foo.plg
данным участком. Тем не менее, я хочу передать имя файла данных в качестве аргумента команды, например running command gnuplot foo.plg foo.data
. Как разобрать аргументы командной строки в файле скрипта gnuplot? Спасибо.
9 ответов:
вы можете вводить переменные через переключатель
-e
$ gnuplot -e "filename='foo.data'" foo.plg
в Foo.plg вы можете использовать эту переменную
$ cat foo.plg plot filename pause -1
чтобы сделать "фу.plg " немного более общий, используйте условное:
if (!exists("filename")) filename='default.dat' plot filename pause -1
вы можете передавать аргументы скрипту gnuplot начиная с версии 5.0, с флагом
-c
. Доступ к этим аргументам осуществляется через переменныеARG0
доARG9
,ARG0
будучи сценарием, иARG1
доARG9
строковые переменные. Число аргументов задается с помощьюARGC
.например, следующий скрипт ("script.gp")
#!/usr/local/bin/gnuplot --persist THIRD=ARG3 print "script name : ", ARG0 print "first argument : ", ARG1 print "third argument : ", THIRD print "number of arguments: ", ARGC
можно назвать:
$ gnuplot -c script.gp one two three four five script name : script.gp first argument : one third argument : three number of arguments: 5
или внутри gnuplot как
gnuplot> call 'script.gp' one two three four five script name : script.gp first argument : one third argument : three number of arguments: 5
In gnuplot 4.6.6 и ранее, существует
call
механизм с другим (теперь устаревшим) синтаксисом. Доступ к аргументам осуществляется через$#
,,...,
. Например, тот же скрипт выше выглядит так:
#!/usr/bin/gnuplot --persist THIRD="" print "first argument : ", "" print "second argument : ", "" print "third argument : ", THIRD print "number of arguments: ", "$#"
и это называется в gnuplot как (помните, версия
gnuplot> call 'script4.gp' one two three four five first argument : one second argument : two third argument : three number of arguments: 5
обратите внимание, что для имени скрипта нет переменной, поэтому
является первым аргументом, и переменные вызываются в кавычках. Нет никакого способа использовать это непосредственно из командной строки, только через трюки, как тот, который предложил @con-fu-se.
вы также можете передавать информацию через среду, как это предлагается здесь. Пример по Исмаил Амин повторяется здесь:
в доспехах:
export name=plot_data_file
в скрипте Gnuplot:
#! /usr/bin/gnuplot name=system("echo $name") set title name plot name using ( * 8):20 with linespoints notitle pause -1
ответ Яри Laamanen является лучшим решением. Я хочу просто объяснить, как использовать более 1 входного параметра с переменными оболочки:
output=test1.png data=foo.data gnuplot -e "datafile='${data}'; outputname='${output}'" foo.plg
и Foo.ПЛГ:
set terminal png set outputname f(x) = sin(x) plot datafile
Как вы можете видеть, больше параметров передаются с полуколонами (как в скриптах bash), но строковые переменные должны быть инкапсулированы с помощью '' (синтаксис gnuplot, а не синтаксис Bash)
вы можете использовать трюк в среде unix / linux:
в программе gnuplot: plot "/dev / stdin" ...
в командной строке: программа gnuplot.участок
на этот вопрос хорошо ответили, но я думаю, что я могу найти нишу, чтобы заполнить здесь независимо, хотя бы для того, чтобы уменьшить нагрузку на кого-то гуглить это, как я сделал. Ответ от vagoberto дал мне то, что мне нужно было решить мою версию этой проблемы, и поэтому я поделюсь своим решением здесь.
Я разработал сценарий сюжета в современной среде, которая позволила мне сделать:
#!/usr/bin/gnuplot -c set terminal png truecolor transparent crop set output ARG1 set size 1, 0.2 rrLower = ARG2 rrUpper = ARG3 rrSD = ARG4 resultx = ARG5+0 # Type coercion required for data series resulty = 0.02 # fixed # etc.
Это прекрасно выполняется из командной строки в среде с недавним gnuplot (5.0.3 в моем случае).
$ ./plotStuff.gp 'output.png' 2.3 6.7 4.3 7
при загрузке на мой сервер и выполнении он не удался, потому что версия сервера была 4.6.4 (текущая на Ubuntu 14.04 LTS). Ниже ШИМ решить эту проблему, не требуя каких-либо изменений в оригинальный сценарий.
#!/bin/bash # GPlot v<4.6.6 doesn't support direct command line arguments. #This script backfills the functionality transparently. SCRIPT="plotStuff.gp" ARG1= ARG2= ARG3= ARG4= ARG5= ARG6= gnuplot -e "ARG1='${ARG1}'; ARG2='${ARG2}'; ARG3='${ARG3}'; ARG4='${ARG4}'; ARG5='${ARG5}'; ARG6='${ARG6}'" $SCRIPT
комбинация этих двух скриптов позволяет передавать параметры из bash в gnuplot скрипты без учета версии gnuplot и в основном любой *nix.
вы могли бы даже сделать некоторые оболочки магии, например, как это:
#!/bin/bash inputfile="" #you could even do some getopt magic here... ################################################################################ ## generate a gnuplotscript, strip off bash header gnuplotscript=$(mktemp /tmp/gnuplot_cmd_$(basename "").XXXXXX.gnuplot) firstline=$(grep -m 1 -n "^#!/usr/bin/gnuplot" "") firstline=${firstline%%:*} #remove everything after the colon sed -e "1,${firstline}d" < "" > "${gnuplotscript}" ################################################################################ ## run gnuplot /usr/bin/gnuplot -e "inputfile=\"${inputfile}\"" "${gnuplotscript}" status=$? if [[ ${status} -ne 0 ]] ; then echo "ERROR: gnuplot returned with exit status $?" fi ################################################################################ ## cleanup and exit rm -f "${gnuplotscript}" exit ${status} #!/usr/bin/gnuplot plot inputfile using 1:4 with linespoints #... or whatever you want
моя реализация немного сложнее (например, замена некоторых магических токенов в вызове sed, пока я уже нахожусь на нем...), но я упростил этот пример для лучшего понимания. Вы также можете сделать его еще проще.... МММ.
в оболочке написать
gnuplot -persist -e "plot filename1.dat,filename2.dat"
и последовательно файлы, которые вы хотите. - persist используется для того, чтобы экран gnuplot оставался до тех пор, пока пользователь не выйдет из него вручную.
еще один способ заключается в следующем:
у вас есть скрипт gnuplot с именем
scriptname.gp
:#!/usr/bin/gnuplot -p # This code is in the file 'scriptname.gp' EPATH = FILENAME = plot FILENAME
теперь вы можете вызвать скрипт gnuplot
scriptname.gp
этим запутанным миром синтаксиса:echo "call \"scriptname.gp\" \"'.'\" \"'data.dat'\"" | gnuplot