つれづれ電脳記(日くらしPCに向かひて)

つれづれなるままに、日くらしPCに向かひて、その悪戦苦闘ぶりをそこはかとなく書き付くるおじさん。たまに雑談[管理人:goosyun]

つれづれなるままに、日くらしPCに向かひて、デジタル関係の悪戦苦闘ぶりをそこはかとなく書き付くるおじさんです。
たまに雑談してます。連絡・問い合わせフォームは、ページ最下部に置いています。[著者(運営人):goosyun]

(当ブログには本文中に広告リンクが含まれています。)

awkのsub()関数の第1引数正規表現の書き方

 テキストデータなどを処理するプログラミング言語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