計算途中にgnuplotで出力したい
状況
数値計算の結果を時間ごとに出力するようなコードを実行している場合、計算の途中でデバッグとして何かデータ(物理量とか保存量とか)を出力するときに、計算途中だと出力ファイルの末尾が書きかけの状態で終わっていて、gnuplotでうまく出力できないときがありますよね。
//test.dat
[time] [data]
1.0 0.9999999998
1.5 0.9999999998
2.0 0.9999999998
2. //途中で切れている
これを何とか簡単に出力できるようにしたい。
解決策
gnuplotのコマンドラインで次のように打ち込む。(linuxの場合)
gnuplot> plot "< head -n `cat [filename] | wc -l` [filename]" #[filename]は表示したいファイルのファイル名
こうすると一番最後の行(中途半端な書き込みになっている行)を除いたデータでグラフを出力できる。
簡単な解説
このコマンドはいくつかのコマンドを合体させたような作りになっている。
まず、gnuplotのplotには標準入力が使えるので、例えば
gnuplot> plot "< head -n 100 test.dat"
と入力すれば、test.datの上から100行を使ってグラフを出力できる。
書き込み途中の行の行数が101行目ならこのコマンドで十分だが、実際は計算の進み具合によってファイルの行数も変化してしまう。
このため、headコマンドに渡す行数をwcコマンドによって取得することを考える。
wcコマンドに-lオプションを付けると、渡されたファイルの「改行の数」を返す。書き込み途中の行は改行コードがないので、この返り値はいま表示したい行数と一致している。上で示したtest.datの場合は、
/home/user> wc -l test.dat
/home/user> 3 test.dat
のようになる。ここで問題なのはファイル名まで返ってくることで、欲しいのは行数だけなので都合が悪い。そこでcatコマンドで一度ファイルを表示し、wcコマンドにパイプで渡すことでこの問題を解決することができる。
/home/user> cat test.dat | wc -l
/home/user> 3
したがってこのコマンドをheadコマンドの-nオプションに``で囲って渡してあげれば最後の行だけ除いて出力ができる。
/home/user> head -n `cat test.dat | wc -l` test.dat #これはhead -n 3 test.datと同じこと
1.0 0.9999999998
1.5 0.9999999998
2.0 0.9999999998