Подтвердить что ты не робот

Как передать аргумент командной строки gnuplot?

Я хочу использовать gnuplot для рисования фигуры из файла данных, скажем, foo.data. В настоящее время я жестко закодировал имя файла данных в командном файле, скажем, foo.plt и выполнил команду gnuplot foo.plg для построения данных. Однако я хочу передать имя файла данных в качестве аргумента команды, например. бегущая команда gnuplot foo.plg foo.data. Как проанализировать аргументы командной строки в файле gnuplot script? Спасибо.

4b9b3361

Ответ 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:

  • в программе gnuplot: plot "/dev/stdin"...

  • В командной строке: gnuplot program.plot < data.dat

Ответ 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