ARAIBOムービーまとめengSearch上田ブログなお、このサイトはbashでできている。今回から新しい話題を扱います。シェルやシェルスクリプトを使った関係演算です。SQLでJOINやSELECTなどと命令を書いて行わせる処理のことをここでは指しています。関係演算だけならテキストファイルでもできます。端末だけで作業が簡潔することが非常に多くなります。次回でシェルスクリプトで簡単なシステムを作ります。これから紹介する方法の延長でデータストアを作ることも可能です。これは別の機会に譲ることとします。自由を保つ¶データをフラットテキストで保存すると話が早いことは、本連載の第一回にも述べました。実は自由が効く方法です。おなじみGancarzのUNIX哲学に次の格言があります。(束縛するインタフェースは作るな。)これは、コマンドは対話的に作ってはいけないということを言っています。なってしまうとquitするまでgrepもcatもリダイレクトも使えなくなります。全部SQLで書かなくてはなりません。アプリケーションの中で全部操作を行うことになります。なってしまうとソフトウェアの方は全部の操作を引き受ける必要が生じて巨大化します。巨大化の途中には頻繁にバージョンアップも起こるでしょう。互換性の問題も発生します。それは欠点までとは言わなくとも不利な点でしょう。テキストですからいつでも表計算ソフトにコピペできます。オプションがややこしいのでこれは使いません。4.2上で試しながら書きました。join1¶まず、join0より先にjoin1を説明します。join1はファイル同士をキーでくっつけるコマンドです。リスト1、2が典型的な使い方です。リスト1のfile1は、魚卵に二桁のコードをつけて管理しているマスタ台帳です。何がいくつ売れたかを記録したファイルです(トランザクションと呼ばれます)。いつ、どれだけ売れたかを知ることができます。12join1は、まさにこのような用途に作られたコマンドで、リスト2のように使います。トランザクションファイルの第2フィールドにキーがあるという意味です。キーの次にマスタ、その次にトランザクションのファイルを指定します。catなどでも使える一般的な記法です。マスタファイルは、必ず左側にキーがあってソートされていなければなりません。マスタの第一フィールドを突き合わせます。キーでソートしなければなりません。ソートしていないと、レコードが抜け落ちます。それを避けるように書いています。トランザクションのレコードを残すjoin2¶join2は、join1と同じ記法で使えますが、挙動が違います。join2はマスタに記録のないトランザクションのレコードも残します。そのようなときにjoin2を使います。join0はマスタにある項目をトランザクションから抽出します。13逆にマスタにない項目を抽出することもできます。標準エラー出力からマスタにないトランザクション項目が出力されます。7#標準出力からはマスタとマッチしたものが出力される。#標準エラー出力を標準出力に振り向けて、もとの標準出力の結果を捨てる。join1でも使えます。今回は、架空の団体「UPS友の会」の会員管理業務を行います。UPS友の会には、会を取り仕切る「スタッフ」がいます。事務局には、次のようなリストがあります。nameだけ)、第三フィールドが電子メールアドレスです。念のため、メールアドレスは架空のものとお断りしておきます。会員も、スタッフと同じフォーマットのリストで管理しています。第一フィールドは会員番号です。人数は10人にして、会員番号は3桁にしておきます。yamaguchi@daioujyou.com会員にもスタッフにも住所は聞いていないので、個人の識別はメールアドレスで行っています。UPS友の会の主な活動は、電源に関する勉強会です。次の勉強会は6月にあり、現在、勉強会への参加者を募集しています。現在の参加者リストは次のようになってます。山本では、この3個のファイルに対して、リレーショナルな演算をしてみましょう。スタッフなのに、会員になってない人のあぶり出し¶まず最初の例です。「スタッフなのに会員になっていない人」が出る可能性があります。会費を取りたいので、しばらく泳がせてから会費を請求して会員にしています。そのようなスタッフのあぶり出しです。出力を見ながら手作業でやったほうがよさそうです。松浦トランザクションにあって、マスタにあるもの/ないものの抽出は、join0で行います。ここでは会員リストをマスタ扱いにして、会員のスタッフ、非会員のスタッフを分別します。