gnuplot を使用して、データ ファイル、たとえばfoo.dataから図を描画したいと考えています。現在、コマンドファイルにデータファイル名をハードコーディングし、たとえばfoo.plt、コマンドを実行gnuplot foo.plg
してデータをプロットしています。ただし、データ ファイル名をコマンド引数として渡したい (例: running command ) gnuplot foo.plg foo.data
。gnuplot スクリプト ファイルのコマンド ライン引数を解析するには? ありがとう。
10 に答える
スイッチを介して変数を入力できます-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引数を使用してshebang gnuplot#!/usr/bin/env gnuplot
を実行する./foo.plg -e ...
と、提供された引数の使用が無視されます。
ここで提案されているように、環境を介して情報を渡すこともできます。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 構文であり、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 で最新) だったため失敗しました。以下の shim は、元のスクリプトを変更することなく、この問題を解決しました。
#!/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 つのスクリプトを組み合わせると、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。