みなさん こんにちわ
だらだらやっているうちに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