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
. 이 인수는 변수를 통해 액세스 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
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 구문)으로 캡슐화되어야합니다
답변
유닉스 / 리눅스 환경에서 트릭을 사용할 수 있습니다 :
-
gnuplot 프로그램에서 : 플롯 “/ dev / stdin”…
-
명령 행에서 : 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.