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


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

9 124

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:

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

  2. в командной строке: программа 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