Как передать аргумент командной строки gnuplot?
Я хочу использовать gnuplot для рисования фигуры из файла данных, скажем, foo.data. В настоящее время я жестко закодировал имя файла данных в командном файле, скажем, foo.plt и выполнил команду gnuplot foo.plg
для построения данных. Однако я хочу передать имя файла данных в качестве аргумента команды, например. бегущая команда gnuplot foo.plg foo.data
. Как проанализировать аргументы командной строки в файле gnuplot script? Спасибо.
Ответы
Ответ 1
Вы можете вводить переменные через переключатель -e
$ gnuplot -e "filename='foo.data'" foo.plg
В foo.plg вы можете использовать эту переменную
$ cat foo.plg
plot filename
pause -1
Чтобы сделать "foo.plg" более общим, используйте условное выражение:
if (!exists("filename")) filename='default.dat'
plot filename
pause -1
Обратите внимание, что -e
должен предшествовать имени файла, в противном случае файл запускается до -e
. В частности, запуск gnuplot #!/usr/bin/env gnuplot
с помощью ./foo.plg -e...
CLI не будет работать.
Ответ 2
Вы можете передать аргументы в gnuplot script с версии 5.0 с флагом -c
. К этим аргументам относятся переменные ARG0
to ARG9
, ARG0
, являющиеся строковыми переменными script и ARG1
to ARG9
. Число аргументов дается ARGC
.
Например, следующий script ( "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
В gnuplot 4.6.6 и ранее существует механизм call
с другим (теперь устаревшим) синтаксисом. Доступ к аргументам осуществляется через $#
, $0
,..., $9
. Например, тот же самый script выглядит следующим образом:
#!/usr/bin/gnuplot --persist
THIRD="$2"
print "first argument : ", "$0"
print "second argument : ", "$1"
print "third argument : ", THIRD
print "number of arguments: ", "$#"
и он вызывается внутри gnuplot как (помните, версия < 4.6.6)
gnuplot> call 'script4.gp' one two three four five
first argument : one
second argument : two
third argument : three
number of arguments: 5
Обратите внимание, что для имени script нет переменной, поэтому $0
- это первый аргумент, а переменные вызываются внутри кавычек. Невозможно использовать это непосредственно из командной строки, только с помощью трюков, как это было предложено @con-fu-se.
Ответ 3
Вы также можете передавать информацию через среду, как предлагается здесь. Пример Ismail Amin повторяется здесь:
В оболочке:
export name=plot_data_file
В Gnuplot script:
#! /usr/bin/gnuplot
name=system("echo $name")
set title name
plot name using ($16 * 8):20 with linespoints notitle
pause -1
Ответ 4
Ответ Жари Лааманен - лучшее решение. Я хочу просто объяснить, как использовать более 1 входной параметр с переменными оболочки:
output=test1.png
data=foo.data
gnuplot -e "datafile='${data}'; outputname='${output}'" foo.plg
и foo.plg:
set terminal png
set outputname
f(x) = sin(x)
plot datafile
Как вы можете видеть, большее количество параметров передается с полуколонами (например, в сценариях bash), но строковые переменные NEED должны быть инкапсулированы с помощью '' (синтаксис синтаксиса gnuplot, NOT bash)
Ответ 5
Вы можете использовать трюк в среде unix/linux:
Ответ 6
На этот вопрос хорошо ответил, но я думаю, что я могу найти нишу, чтобы заполнить здесь, несмотря на то, что только для того, чтобы уменьшить нагрузку на кого-то, похожего на googling. Ответ от 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=$1
ARG2=$2
ARG3=$3
ARG4=$4
ARG5=$5
ARG6=$6
gnuplot -e "ARG1='${ARG1}'; ARG2='${ARG2}'; ARG3='${ARG3}'; ARG4='${ARG4}'; ARG5='${ARG5}'; ARG6='${ARG6}'" $SCRIPT
Комбинация этих двух скриптов позволяет передавать параметры из bash в скрипты gnuplot независимо от версии gnuplot и в основном любого * nix.
Ответ 7
Вы можете даже сделать магию оболочки, например. например:
#!/bin/bash
inputfile="${1}" #you could even do some getopt magic here...
################################################################################
## generate a gnuplotscript, strip off bash header
gnuplotscript=$(mktemp /tmp/gnuplot_cmd_$(basename "${0}").XXXXXX.gnuplot)
firstline=$(grep -m 1 -n "^#!/usr/bin/gnuplot" "${0}")
firstline=${firstline%%:*} #remove everything after the colon
sed -e "1,${firstline}d" < "${0}" > "${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-вызове, пока я уже нахожусь...), но я упростил этот пример для лучшего понимания.
Вы также можете сделать это еще проще... YMMV.
Ответ 8
В оболочке пишите
gnuplot -persist -e "plot filename1.dat,filename2.dat"
и последовательно файлы, которые вы хотите.
-persist используется, чтобы экран gnuplot оставался до тех пор, пока пользователь не выйдет из него вручную.
Ответ 9
Еще один способ:
У вас есть gnuplot script с именем scriptname.gp
:
#!/usr/bin/gnuplot -p
# This code is in the file 'scriptname.gp'
EPATH = $0
FILENAME = $1
plot FILENAME
Теперь вы можете вызвать gnuplot script scriptname.gp
с помощью этого свернутого мира синтаксиса:
echo "call \"scriptname.gp\" \"'.'\" \"'data.dat'\"" | gnuplot