[command-line] gnuplot에 명령 줄 인수를 전달하는 방법은 무엇입니까?

gnuplot을 사용하여 foo.data 와 같은 데이터 파일에서 그림을 그리 려고 합니다. 현재 명령 파일에 foo.plt 와 같은 데이터 파일 이름을 하드 코딩하고 명령 gnuplot foo.plg을 실행 하여 데이터를 플로팅했습니다. 그러나 데이터 파일 이름을 명령 인수로 전달하고 싶습니다 (예 : running command) gnuplot foo.plg foo.data. gnuplot 스크립트 파일에서 명령 행 인수를 구문 분석하는 방법은 무엇입니까? 감사.



답변

스위치를 통해 변수를 입력 할 수 있습니다 -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문. 특히 CLI 인수 #!/usr/bin/env gnuplot와 함께 shebang gnuplot 을 실행하면 ./foo.plg -e ...제공된 인수 사용이 무시됩니다.


답변

버전 5.0부터 gnuplot 스크립트에 플래그를 사용하여 인수를 전달할 수 있습니다 -c. 이 인수는 변수를 통해 액세스 ARG0ARG9, ARG0스크립트 및 인 ARG1ARG9문자열 변수. 인수 수는로 제공됩니다 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

gnuplot 4.6.6 및 이전 버전 call에는 다른 (더 이상 사용되지 않는) 구문 의 메커니즘 이 있습니다 . 인수를 통해 액세스 할 수 있습니다 $#, $0, …, $9. 예를 들어 위의 동일한 스크립트는 다음과 같습니다.

#!/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

스크립트 이름에 대한 변수가 없으므로 $0첫 번째 인수도 있으며 따옴표 안에 변수가 호출됩니다. @ con-fu-se가 제안한 트릭을 통해서만 명령 줄에서 직접 사용할 수는 없습니다.


답변

여기 에 제안 된대로 환경을 통해 정보를 전달할 수도 있습니다 . Ismail Amin 의 예제 는 여기에서 반복됩니다.

쉘에서 :

export name=plot_data_file

Gnuplot 스크립트에서 :

#! /usr/bin/gnuplot

name=system("echo $name")
set title name
plot name using ($16 * 8):20 with linespoints notitle
pause -1


답변

Jari Laamanen의 답변이 최고의 솔루션입니다. 쉘 변수와 함께 둘 이상의 입력 매개 변수를 사용하는 방법을 설명하고 싶습니다.

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 구문)으로 캡슐화되어야합니다


답변

유닉스 / 리눅스 환경에서 트릭을 사용할 수 있습니다 :

  1. gnuplot 프로그램에서 : 플롯 “/ dev / stdin”…

  2. 명령 행에서 : gnuplot program.plot <data.dat


답변

이 질문에 대한 대답은 잘 들리지만 내가 한 것처럼 인터넷 검색을 수행하는 사람의 작업 부하를 줄이려면 여기에 상관없이 틈새를 찾을 수 있다고 생각합니다. 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

이 두 스크립트를 조합하면 gnuplot 버전 및 기본적으로 * nix와 상관없이 bash에서 gnuplot 스크립트로 매개 변수를 전달할 수 있습니다.


답변

다음과 같은 쉘 마법을 수행 할 수도 있습니다.

#!/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.