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

 みなさん こんにちわ
 だらだらやっているうちに20回になりました。もうしばらくのゴミ捲きをお許しください。

正規表現(つづき)

 awkで正規表現を使う場合は //ではさみます。いろいろな場面で使いますけど、まずは3パターンマスターすれば十分実用になります。

 1. 「パターン」部分で使う
 そのものズバリをパターン部分に書くと、レコードが正規表現にマッチするか、という意味になります。マッチすればパターン以下のアクションが実行されます。

 例えばホームページのログに対して

   /^[0-9][0-9][0-9] +\[/{print $1,$4}

とやると、発言タイトルの部分から、発言番号と発言者のIDが表示されます。


 2. 演算子 ~ を使う
 正規表現マッチ演算子~を使うと、さらに細かい指定ができます。
 書式は「文字列 ~ /正規表現/」です。正規表現を右側におくのがお約束です。文字列が正規表現にマッチすれば真になります。

 例えばテストの平均を求める場合、前回のように全部の科目が揃ったデータばかりが相手とは限らず、追試だから社会だけ、主要科目の国語と算数だけ、といったこともあるでしょう。
 下のデータで、織田信長君の国語の平均点を求めることを考えましょう。

織田信長 84 88 80 75
織田信長 64 78 88 57
織田信長 - - - 58
織田信長 * * * 63
織田信長 94 98 90 85
織田信長 74 78 70 65
織田信長 84 68 - -

 第2フィールドを見て数字が入っていれば処理、数字以外ならばスキップすればいいわけです。では、スクリプトの例。

   {
   $2 ~ /^[0-9]+$/ ? kokugo[$1] += $2 : kokugo[$1];
   $2 ~ /^[0-9]+$/ ? ++kaisu[$1] : kaisu[$1];
   }

  END{for(i in kaisu){
      printf("%sの国語の平均点は %.2f点です\n",i,kokugo[i]/kaisu[i]);
          }
     }

》 $2 ~ /^[0-9]+$/ ? kokugo[$1] += $2 : kokugo[$1];
   ^^^^^^^^^^^^^^^
 ここがポイントです。第2フィールドが数字ならば ? の次の処理、そうでなければ : の次の処理をします。この「式 ? 式 : 式」演算子は、上手く使うとなかなか便利です。

 余談ですが、世のデータベースには「数値データのフィールドが未入力ならば0と見做す」という乱暴な仕様のものがあります。テストの点数など0に意味がある(無試験と0点は違う)データを扱う場合、これでは困りますね。


 3. 置換でつかう
 文字列操作関数 sub, gsubでは置換対象文字列の指定に正規表現が使えます。第10回でgsubを取りあげたときに {gsub(/[ ][ ]+/,"")} という例を使いました。これが「連続した2つ以上の半角空白を消去せよ」という意味になることはもうお解りですね。



 初出 NIFTY-Serve「みんみんネット」1996/09/28 (Sat) 14:13:10