Gnuplotスクリプトがあります(EXE)、このスクリプトで私が提供したX_001いくつかの関数によって描かれた入力ファイルとして出力ファイルを提供します。X_001.png。入力ファイルと出力ファイルの名前を手動で入力すると正常に動作します。ファイルに対してこのスクリプトを繰り返しようとしています。{X_001..X_300} 私はこのループを書いた。
for i in X_*; do sed -i 's/X_*/${i}/g' exe ; ./exe ; done
しかし、これは役に立ちません。
ここで状況が変わりますexeスクリプトを書く必要がある
set term png size 1600,1200
set output "X_001.png"
splot 'X_001'
答え1
私はBashスクリプトを使用することを好みますgnuplot
。ファイルをデータとして使用してみてください。したがって、データファイルがあり、次のようにプロットしようとしているとします。X_*
X_*.png
X_*.out
X_*.png
#!/bin/bash
export LANG=C LC_ALL=C
for data in X_*.out ; do
[ -r "$data" ] || continue
png="${data%.*}.png"
gnuplot <<END-OF-PLOT
set term png enhanced size 1024,512
set output "$png"
set title "$data"
plot "$data" u 1:2 notitle w lines
END-OF-PLOT
done
このexport LANG=C LC_ALL=C
行はデフォルトのC / POSIXロケールを設定します。他の人(例:インストラクター/教師/ TA)が同じスクリプトを実行しているが、偶然に異なる言語を使用している場合(そしてあなたと他のロケールを好む)、まだ同じプロットを再生成します。
(問題はあるロケールは.
小数点として使用し、あるロケールは,
。.
globパターンと一致するファイルがない場合、デフォルトX_*.out
ではBashはループ本体を1回繰り返し、data
値X_*.out
自体を持ちます。この[ -r "$data" ] || continue
テストは、指定された読み取り可能ファイルが変数に存在することを確認しますdata
。それ以外の場合は、次の繰り返しにジャンプします(残りのループ本体はこの値に対して実行されません)。
png
割り当てに注意してください。${data%.*}
結果は変数値data
(ここではデータファイル名)ですが、最後からすべてが.
削除されます。 (.
中になければdata
何も削除されません。)
したがって、Bashでは${data%.*}.png
結果はの値ですが、data
ファイル名のサフィックスがある場合に置き換えられます.png
。ファイル名のサフィックスがない場合は.png
追加されます。
<<END-MARKER
起動に使用ここのドキュメントバッシュから。次に始まる行の内容まで(ただし、含まない)がEND-MARKER
入力として提供されます。ただし、この資料では変数の拡張が行われているため、この資料または構文$variable
(およびその他の構文)を使用してその${variable}
内容に置き換えられます。
Bashコマンドラインコマンドとは異なり、ここでBashドキュメントの引用符は保持されます。したがって、png
値がある場合はX_001.out
拡張されset output "$png"
、Gnuplotはそれを処理しますset output "X_001.out"
。
答え2
たとえば、入力ファイルと出力exe-template
ファイルの名前にはテンプレートスクリプトにプレースホルダを使用します。X_input
X_input.png
set term png size 1600,1200
set output "X_input.png"
splot 'X_input'
次に、ループ内のデータファイルの名前をsed
変更しX_input
、結果修正スクリプトを一時ファイルに書き込みます。例exe-tmp
:
for i in X_[0-9][0-9][0-9] ; do
sed -e 's/X_input/'${i}'/g' exe-template >exe-tmp
chmod 755 ./exe-tmp
./exe-tmp
done