テキストデータなどを処理するプログラミング言語awkでは、sub()やgsub()は、文字列置換の関数です。
sub(置換対象正規表現,置換後文字列,入力文字列)
という書き方をします(第3引数省略では、$0となります。)。
これで、第1引数の正規表現にマッチする文字列が、第2引数の文字列で置換されます。
例えば、次の記述をして実行すると、aiuEo と出力されます。
$ echo "aiueo" | awk '{sub(/e/,"E");print}'

data.txtという名前のテキストファイルに、次のようなデータが入力されています。
1 太郎
2 二郎
3 三郎
4 四郎
5 五郎
上記データの第2フィールドの値すべてに「_さん」という文字列を付け加えようと、次の記述をして実行しました。
$ awk '{sub(/$2/,"&_さん");print}' data.txt
ところが、これだと置換が行われません。ですから、元データがそのまんま出力されるだけです。
最初は原因が分からず、「ん?」ってなりました。間違っていたのは、sub()関数の第1引数の書き方です。
正規表現ならば、すべてスラッシュ(/)で囲む必要があると思い込み、スラッシュを付けたのが誤りです。リテラルならばスラッシュで囲みますが、変数ならばスラッシュは不要です。/$2/の書き方をすると、$2という文字列が置換対象となります。文字列$2は存在しないので、置換は行われません。
正しい記述は、次のとおりです。
$ awk '{sub($2,"&_さん");print}' data.txt
これを実行すると、1 太郎_さん 2 二郎_さん 3 三郎_さん・・・と、意図どおりの出力がされます。
awkで正規表現パターンを記述するのに、リテラルはスラッシュで囲む、変数にはスラッシュが不要、というのは次の場合も同じです(data.txtは上掲に同じとする。)。
awk -v hensu="四" '$2 ~ hensu' data.txt
これを、awk -v hensu="四" '$2 ~ /hensu/' data.txt とすれば誤りとなります。
それではまた次の記事で。
goosyun
