西田顕郎はじめにテキスト形式の数値データの処理・解析には、awk+シェルスクリプトが最強である。これまでエクセルやC言語、FORTRANなどしか知らなかった人には、ぜひawk+シェルスクリプトの世界を体験して欲しい。気象データなど、大量のテキスト形式数値データをいじる人には、人生の転換点と言えるほどの衝撃が待っている。awk+シェルスクリプトの使用環境は、当然ながらUNIXシェルである。Windowsユーザーは、Cygwinで擬似的にUNIXシェル環境を構築してください。参考になるページこことかこことかawkとは?awkは、テキストデータの1行づつに対して処理をする、プログラミング言語(スクリプト言語)である。コンパイルは必要ない。UNIXのコマンドラインの出力に、パイプでつないで実行できる。-lの出力)をawkで加工してみよう。haichi.pdfこのとき、ファイルサイズとファイル名のみを抜き出して表示してみよう。haichi.pdfここで、$5は「5列目のデータ」の意味。NFは、各行のフィールド数(列の数)。$NFは、「NF列目のデータ」、つまり、その行の最後の列のデータ、ということ。例1の出力で、ファイルサイズを1024で割る、つまりキロバイト単位で表示する。haichi.pdfこれらの例を見れば、awkの文法は、なんとなく直観でわかるだろう。実際、awkは極めて直観的な言語である。文法はCに似ているが、Cよりもはるかにフレキシブルで直観的だ。ifもforも使える。変数も配列も使えるが、それらの初期宣言は不要だ。これだけわかれば、もうawkのポテンシャルを発揮できる。以下、実際のデータをいじってみよう。TERCこれが、site.txtという名前のテキストファイルになっているとしよう。140.10極めて簡単である。「並べ替えくらいエクセルでもカットペーストでできる」と思う人、あなたは甘い。エクセルで扱うことができるのは、65536行までのデータである。awkなら、データが数万行にわたっても問題なく走る。大切なことは、後述するが、awkの処理はシェルスクリプトに書き込むことができる、ということである。この出力を、アルファベット順に並べたいとする。141.51大規模データの処理ここでは、実際にフィールドで観測されたデータを解析してみよう。PAR)のデータである。sample.txt2005,170,600,1.058,.044,-.0332005,170,605,.991,.06,.0672005,170,610,1.022,.033,.0872005,170,615,1.062,.02,-.0172005,170,620,1.313,.044,.0132005,170,625,1.186,.03,-.023......各行に、各年,日付,時刻,センサ1,センサ2,センサ3の順にデータが入っている。Dayともいう)、時刻は、1または2桁で時、2桁で分をあらわす(たとえば605は午前6時05分)。各列はコンマで区切られている。センサは1から3まであり、センサ1は森の樹冠の上に突き出たタワーの上で、空からやってくる光を観測している。3は、林床に設置されており、森の樹冠を透過した光を、それぞれ別の場所で観測している。センサ1〜センサ3の出力は、それぞれセンサの電圧(mV)であらわされており、これを実際の物理的な値(この場合はμmol/m2/sec)に変換するには、それぞれのセンサに固有の係数をかけてやる必要がある。センサの出力を物理値に変換しよう。290.84これらの値を、各センサの出力(mV)にかけてやれば、センサの電圧出力は物理値に変換される。separator,略してFS)はコンマで表す」という意味。これを宣言することで、各行の列をコンマで区切ることが指示される(ちなみにデフォルトではFSはスペースかタブである)。その次の{}内の意味は自明だろう。次に、時刻を"605"のような時分表示ではなく、1日の通算の分で表示しよう。3.78092さらに、時刻を1日単位で日付けにあわせてしまおう。1次データから最終結果(グラフ)までの処理工程を全て完全に記録でき、必要ならば簡単に再現できる。同様のデータについて、同様の処理をするときに使いまわすことができる。処理の一部を変更して全てをやり直すのも容易である。この例では、センサの出力を物理値に変換する係数を変更する、などの場合である。処理のノウハウを公開したり、他の研究者と共有することが容易である。ここで述べた1の事項、つまり1次データから最終結果(グラフ)までの処理工程を全て完全に記録するということは、一般にはあまり意識されていないが、実は科学研究では極めて重要なことである。科学者・技術者の倫理として、なんらかの研究・解析をやった結果のデータを世間に発表する前に、その正しさを十分にチェックしなければならないし、発表したあとも、常にそのデータ処理の細部に関して、だれかから問い合わせがあったときに対応できなくてはならない。そのためには、最終的に発表するデータが、どのようなデータから、どのような工程を経て加工されたか、たどれなければならない。これを、「処理のトレーサビリティ」と呼ぼう。処理のトレーサビリティを確保するためには、データに施した全ての処理を記録する必要がある。シェルスクリプトはそれを実現するのだ。そのようなことを、シェルスクリプトを使わずに、たとえば表計算ソフトなどのグラフィカルインターフェースに基づく処理で行うのは大変である。4.5035単位は、mol/dayである。この考え方を使えば、時間ごとの積算や平均値も簡単に計算できる。簡単な例として、日射(PAR)の、森林樹冠透過率を求めてみよう。ゼロでの除算を行いました。上のようなエラーが出てしまった。これは、センサ1の出力がゼロのとき、ゼロが分母になるような割り算をすることになってしまうからである。5というふうなファイルにしたい、ということがよくある。data2.txtとすればよい。標準出力に書き出されるから、ファイルにリダイレクトしてもいいし、パイプでawkなどに流し込んでもよい。双方のファイルにキーとなる列(時刻とか)があると、それを合致させるように行どうしをくっつける。外から与える引数は、BEGIN{}の中には反映されない。y/xのアークタンジェント。