foo.dataのように、gnuplotを使用してデータファイルから図形を描画します。現在、コマンドファイルにデータファイル名をハードコーディングし、たとえばfoo.pltを指定し、コマンドgnuplot foo.plg
を実行してデータをプロットします。ただし、コマンドファイルの引数としてデータファイル名を渡します。コマンド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
-c
フラグを使用して、バージョン5.0以降のgnuplotスクリプトに引数を渡すことができます。これらの引数には、変数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が提案するトリックを使用する方法のみです。
here のように、環境を通じて情報を渡すこともできます。 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スクリプトのように)より多くのパラメーターがセミコロンで渡されますが、文字列変数は ''でカプセル化する必要があります(gnuplot構文、not bash構文)
UNIX/Linux環境でトリックを使用できます。
gnuplotプログラムの場合:plot "/ 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
これらの2つのスクリプトを組み合わせることで、パラメーターをbashからgnuplotスクリプトに渡すことができ、gnuplotのバージョンに関係なく、基本的にすべての* nixで使用できます。
シェルマジックを実行することもできます。このような:
#!/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。
シェルで書く
gnuplot -persist -e "plot filename1.dat,filename2.dat"
続けて必要なファイル。 -persistは、ユーザーが手動で終了しない限り、gnuplot画面を維持するために使用されます。
さらに別の方法は次のとおりです。
scriptname.gp
という名前のgnuplotスクリプトがあります:
#!/usr/bin/gnuplot -p
# This code is in the file 'scriptname.gp'
EPATH = $0
FILENAME = $1
plot FILENAME
これで、この複雑な構文の平和によってgnuplotスクリプトscriptname.gp
を呼び出すことができます:
echo "call \"scriptname.gp\" \"'.'\" \"'data.dat'\"" | gnuplot