gnuplotで役に立つawkコマンド

awkについて

awkは簡易的なテキスト成型を行えるプログラミング言語です。コマンドラインからの呼び出しができるので、gnuplot単体ではできないようなテキスト処理もgnuplotのsystem()コマンドからawkを呼び出すことで行うことができます。

Windowsの場合、gawk for Windowsの日本語版があります(2010年12月現在公開停止中?)。また、英語版もあります。

これらのインストール方法は、ダウンロードしたファイルを解凍して適当なフォルダに保存し、そこにPathを通しておくだけです。Pathの設定方法は、Windows XP以降ならば以下のとおりです: 「コントロールパネル」→「システム」→「詳細設定」→「環境変数」で、環境変数pathにgawkをインストールしたフォルダ名をセミコロンで区切って追加します。

gnuplotからawkのコマンドを使う

awkのコマンドを使うには、gnuplotのsystem()を使います。例を以下に示します。

awkinput  = "awkin.dat"  # awkへの入力ファイル
awkoutput = "awkout.dat" # awkからの出力ファイル
awkcommand= sprintf('gawk "$0 ~ /[i]$/ {print} " %s > %s', awkinput, awkoutput) # コマンドを作る
system(awkcommand) # 実行

上の例ではawkへの入力ファイル名とawkからの出力ファイル名をそれぞれ文字列変数awkinputawkoutputとして保持しておきます。これらをsprintf()を使ってコマンドの文字列awkcommandに挿入しています。そして、awkcommandに保存したコマンドをsystem()を使って実行しています。なお、二重引用符と一重引用符の使い分けに注意してください。

結局のところ、上記例では以下のようなコマンドを実行していることになります。すなわち、入力ファイルを"$0 ~ /[i]$/ {print} "というawkコマンドで処理し、その結果を出力ファイルにリダイレクションして保存します。

gawk "$0 ~ /[i]$/ {print} " awkin.dat > awkout.dat

このように入力・出力ファイル名を文字列変数に分離しておくと後での使い回しに便利です。

役に立つawkコマンド

以下ではgnuplotを使う上で役に立つawkコマンドを紹介します。これらの例を使用する際には、スクリプトの前の方でawkinputawkoutputの二つの文字列変数(ファイル名)を指定しておいてください。また、awkの文法についてはマニュアルページ等を参考にして下さい。

末尾がi以外のデータ行を消す(空行も消す)

# 末尾がi以外のデータ行を消す(空行も消す)MinGW+MSYSのgawkを使う場合(かつ改行コードがCRLFのとき)
awkcommand= sprintf("gawk '$0 ~ /i\\r/ {print} ' %s > %s", awkinput, awkoutput) 
system(awkcommand) # 実行
# 末尾がi以外のデータ行を消す(空行も消す)gawk for Windows 日本語版を使う場合
awkcommand= sprintf('gawk "$0 ~ /[i]$/ {print} " %s > %s', awkinput, awkoutput) 
system(awkcommand) # 実行

set tableを使ってgnuplotからデータをファイルに出力すると、場合によっては不必要なデータがファイルに含まれることがあります。基本的に、不必要なデータはデータ行の末尾がi以外の文字になっていますので、そうなっていない行を上記コマンドで消去することで、必要なデータだけのデータファイルを作ることができます。

末尾がi以外のデータ行を消す(空行は消さない)

# 末尾がi以外のデータ行を消す(空行は消さない)
awkcommand= sprintf('gawk "$0 ~ /([i]|^)$/ {print} " %s > %s', awkinput, awkoutput) 
system(awkcommand) # 実行

上と同様の状況でも、場合によっては空行を消さない方がいい場合もあります。(splotしたデータファイルの場合など)その場合は上記コマンドを使用してください。

空行を消す

# 空行を消す
awkcommand= sprintf('gawk "$0 !~ /^$/ {print} " %s > %s', awkinput, awkoutput) 
system(awkcommand) # 実行

データファイルの空行のみを消す場合はこのコマンドを使用してください。

2行の空行を1行の空行にする

# 2行の空行を1行の空行にする
awkcommand= sprintf('gawk "BEGIN {frag=0} {if ($0 ~ /^$/) frag=frag+1; else frag=0;}\
            {if (frag<=1) print}" %s > %s', awkinput, awkoutput) 
system(awkcommand) # 実行

2行の空行を1行の空行にするには、少々複雑ですが上のコマンドを使います。これはハートのアニメーションで使っています。

特定の文字を消す

# 特定の文字を消す
chars = '\"#'   # 消去する文字(複数指定可能)二重引用符は\でエスケープすること
awkcommand= sprintf('gawk "{gsub(/[%s]/, \"\"); print > "%s";}" %s', chars, awkoutput, awkinput)
system(awkcommand) # 実行

特定の文字をデータファイルから消す場合には上記コマンドを使用します。上記例ではawkinputファイルからcharsでしていている文字"#をすべてデータファイルから除去します。なお、普通の文字はcharsに含めるだけでOKなのですが、二重引用符だけは前に\を付けてエスケープしておいてください。また、上記例を使用する際には、これまでの例に比べてawkinputawkoutputの順番が逆になっていることに注意してください。

この例はこちらで使用している例をより一般化したものです。