Let's GAWK! とにかく使うJGAWK その5

 みなさん こんにちわ
 予告通り、もう少し複雑な処理にチャレンジします。

 当院は血液検査の一部をオートアナライザで院内処理していますが、さらに検査結果をテキストファイルで出力できるようになっています。

 実際の出力はさらに複雑なのですが、少し加工したものを示します。フィールドの区切りはカンマ(,)各フィールドは次の順です。

受付日付,検体番号,患者番号,氏名,性別,年齢,所属,病棟,検体性状,採取日,総蛋白,
A/G比,GOT,GPT,LDH,ALP,γ-GTP,ZTT,Cr,尿素窒素,尿酸,T-Cho,HDL-C,中性脂肪,CRP,
WBC,RBC,Hb,Ht,PLT,血糖,

 以下は実際のデータです。人間ドックの例で氏名は変えてあります。もとのデータは1レコードが80桁を超えていますが、便宜上78桁前後で改行を入れてあります。


960105,19,960001,ノハラ シンノスケ,M,57,6,0,0,960105,7.8,1.69,25,21,333,138,
25,5.2,0.6,19.4,4.1,223,80,140,0.1,5800,514,15.9,48.4,29.1,83
960105,20,960002,ノハラ ミサエ,F,56,6,0,0,960105,7.1,1.96,23,32,225,118,23,2.6,
0.6,21.0,5.8,163,50,204,0.1,6700,543,17.0,49.3,21.6,78
960105,21,960003,ノハラ ヒロシ,M,53,6,0,0,960105,7.4,1.47,31,57,249,105,104,
7.5,0.6,12.8,7.7,258,113,613,0.2,6900,511,15.6,46.0,25.7,92
960106,24,960005,ヨシナガ ミドリ,F,34,6,0,0,960106,7.1,1.54,25,32,288,101,39,
4.2,0.6,13.1,6.6,160,46,98,0.6,6600,522,16.2,48.6,20.5,82
960106,25,960004,マツザカ ウメ,F,36,6,0,0,960106,7.7,1.57,33,27,311,168,189,
2.8,0.6,15.9,9.2,199,90,83,0.8,4200,466,14.3,43.2,25.9,96


 まず、男性のみ受付日と氏名を表示します。

  BEGIN{FS=","}
  $5 == "M"{print $1,$4}

 FSはフィールドセパレータです。デフォルトは空白またはタブですが、この例のように自分で指定することもできます。はじめの行を読む前に変更されている必要があるので、通常このように BEGINパターンで処理します。

 次が今回のテーマです。{ }の前の部分を「パターン」といい、ここにマッチしたレコードのみに以降のアクション({ }の中身ですね)が作用します。
 パターンには一般に「式」を書きます。式を評価して「非0」ならばその式は「真」つまりマッチしたと判断されます。

 式としてはいろいろなものが書けます。==, >, <, >=, <=,などの等号不等号をはじめ(等号は == です。= は代入です。お間違えなく)、以前示した正規表現および、これらの論理的な組み合わせ(&& が and、|| が or です)などです。

 この例では「第5フィールドが M に等しい」というパターンに合ったレコードのみにアクションが作用します。


 例をもう一つ。男性の受診者総数を表示します。

  BEGIN{FS=","}
  $5 == "M"{++man}
  END{print man}

 manは変数です。++ は変数の値を1増やす演算子です。man = man + 1 と書いても同じです。ここまでの知識でちょっとした集計は既に十分可能なはずです。


 次回は同じデータでさらにいろいろな処理をしてみます。



 初出 NIFTY-Serve「みんみんネット」1996/09/12 (Thu) 13:13:34