数値計算とかやってると、
result0.dat
result1.dat
result2.dat
result3.dat
・・・
という連番ファイルを作りたくなる事がよくある。
当然できたファイルは結合してアニメーションにして研究室セミナーで発表するとか学会で使うとかしてドヤフェイスをかますのである。
((まぁ実は最近のgnuplotなら、連番ファイルを経ずにアニメーションを作れたりもしますが…。))
で、アニメーションにする方法はさておき、こういう時どうすればいいかを備忘録代わりに。
#shell script + バッチファイル
まずバッチファイルを作っておく。
reset
input = sprintf("resuld%d.dat", i)
set term postscript enhanced eps color
set output sprintf("result%03d.eps", i)
plot input なんちゃらかんちゃら
set output
reset
どうせバッチファイルなのでset termは戻さなくていいやと開き直る。
これを適当にloop.pltとでも名づけて保存しておく。
で、次にshell scriptを組む。
gnuplotはバッチファイル食べさせる前に-e "云々"
と入れとくと、
前処理として云々をしといてくれるので、ここでファイル番号を変数に突っ込みながら、
処理部分のバッチファイルを食わせてループを回す。
あと、時間削減のためすでに画像ファイルが出来ている場合はスキップさせる。
#!/bin/sh
st=$1
while [ $st -le $2 ]; do
if [ ! -e $(printf "result%03d.eps" $st) ]; then
gnuplot -e "i=${st}" loop.plt
fi
st=`expr $st + 1`
done
ここまで書いてloop.shみたいな名前で保存したら、実行権限を与える。
chmod u+x loop.sh
んで、実行の仕方はこう。
./loop.sh 0 10
もちろん、環境変数PATHに./が入っていれば頭の./は要らない。
これで0から10番までのファイルが順番に作られる。
あとはimage magickでも使ってアニメイションにしてくだしあ。
#gnuplotでforする
割合最近の(いつだ?)gnuplotは、for loopに対応していたりするので、それを使ってしまう。
もうあるファイルはスキップするみたいな小回りは効かないけど。
reset
st = 0
to = 10
offset = 2
do for[i = st : to : offset]{
input = sprintf("resuld%d.dat", i)
set term postscript enhanced eps color
set output sprintf("result%03d.eps", i)
plot input なんちゃらかんちゃら
set output
}
reset
残念ながら割と新し目(2014/05/31現在)の機能なので、ちょっと古いgnuplotしか使えなかったりすると駄目だったりする悲しさが有る。