gnuplot で外部コマンドを実行する

はじめに

データをプロットする場合、初期値を用いて演算したい状況があります。例えば、初期値に対しての増分や変化分の推移を見たい場合などです。

gnuplot ではusingで演算を指定できます。その演算式に初期値を使うことで、初期値に対する増分や変化分を計算することが出来ます。

多くのデータに対してこのような演算をする場合、個々のファイルから初期値を参照する必要があります。しかし、手動でこれを行うのは煩雑です。

そこで、gnuplotから外部コマンドで初期値を取得することで、個々のファイルから値を参照する方法を考えます。

初期値を取得するコマンド

UNIX likeな環境(例えば、Linux, Cygwin)では次のコマンドで得ることができます。hoge.datというファイルから1行目の2カラム目の値を取得するコマンドは次の様なものです:

> head -n 1 hoge.dat | gawk '{print $2}'

headはファイルの先頭部分だけを取得するコマンドで、-nのオプションで行数を指定します。ここでは1行だけ取得します。”|”はパイプと呼ばれるもので、前のコマンドの出力を、次のコマンドの入力にする、という意味です。

gawk(akwでも良い)は、得られた1行から2カラム目だけを表示しています。

このコマンドをgnuplotから実行できればよいわけです。

gnuplot から初期値取得コマンドを実行する

gnuplotでは外部コマンドは systemというコマンドで実行します。上記の初期値取得コマンドを実行するには次のようにします:

init = system("head -n 1 hoge.dat | gawk '{print $2}'")

上の例では、initという変数に初期値を格納します。こうすると、例えば初期値からの変化をプロットするには

plot 'hoge.dat' using 1:(init - $2 )

のように出来ます。

コメント行をスキップしたい場合

gnuplotではデフォルトで各行の#以降はコメントとして扱われます。例えばデータファイルの先頭に実験条件などがコメントとして記載されている場合は、スキップして初期値を取る必要があります。この場合に、初期値を取得するには少し工夫をします。データの先頭に#から始まるコメント行がある場合は、grepを使って次のようにします:

> cat hoge.dat | grep -v "^#" | head -n 1 | gawk '{print $2}'

cat はファイルの中身を全部表示します。grep は -vで invert matchさせます。すなわち、”^#”にマッチしない行を取り出します。”^#”は#で始まる行という意味です。後は上記と同様で、パイプでつないでいます。

gnuplot内では次のように書きます:

init = system("cat hoge.dat | grep -v \"^\#\" | head -n 1 | gawk '{print $2}'")

ここで、#と”をエスケープしています。

まとめ

UNIX likeな環境では、初期値だけでなく、別のコマンドを組み合わせてファイル中から任意の位置の値を取り出すことができます。例えば、最後のデータ値を使いたい場合にはtailコマンドが使えます。