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

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

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

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

gawkインストールでawk正規表現が日本語対応

 

 

1 awk正規表現の日本語対応

  Ubuntu PCに保存したテキストファイルの中から、正規表現を使って、必要とするデータだけを取り出すawkを実行しました。
 そうすると、半角英数字が入ったフィールドでの抽出は成功するのに、全角日本語のフィールドでは失敗します。
 生成AIで調べると、awk正規表現が日本語などのマルチバイト文字に対応してないから、という回答でした。それが、2025年9月17日付けの「awk正規表現の日本語対応」という記事です。

2 あきらめようとしていたら…

 ならば仕方ない、日本語を対象とするawk正規表現検索はあきらめよう、としていたところ、narkejpさんという方がコメントをくださいました。narkejpさんには、これまでも幾度か助けていただきましたが、今回もまた、大変貴重な助言をいただきました。
 「日本語を扱うには gawk が適しており、これをインストールして使ってみればいかが?」というコメントでした。

3 Ubuntu環境を調査

 そこで、現在使っている Ubuntu 24.04 LTS に入っている awk を調べてみました。まず、$ awk -W version を実行しました。すると、mawkのバージョンが表示されました。
 では、mawkしか入っていないのか、mawkもgawkも、両方とも入っていることはないのか、気になります。というのも、Ubuntuの前バージョン 22.04 LTSでは、デフォルトで両方とも入っていましたから。これを調べるために、whichコマンドを実行しました。whichコマンドは、指定されたコマンドをサーチパスから探し、見つかれば、その実行ファイルのフルパスを表示します。何もオプションを付けないと、見つかった最初のコマンドだけを表示するところ、-aオプションを付けることで、すべての実行ファイルの場所を示してくれます。もし、対象コマンドがない環境では何の反応もないので、それで判断できます(コマンドが入っていても、サーチパスに登録されていないと同じく反応がありませんが、まぁ、稀有な事例)。
 んで、$ which -a mawk と、 $ which -a gawk の両方を実行しました。そうすると、 mawkはその実行ファイルの場所を示し、一方gawk については、反応がありません。つまり、gawkはインストールされていないことが分かりました。

4 gawkのインストール

 gawkが入っていないと分かれば、インストールです。
  $ sudo apt update
  $ sudo apt install gawk
を実行しました。
 これで、インストールができました。 

5 awkの実行

 mawkとgawkの両方とも入っている状態なので、awkの入力でgawkが実行されるように、切り替え作業が必要かもしれない、と思っていました。
 けれども、$ ls -l /bin/awk で調べると、/etc/alternatives/awkへのシンボリックリンクになっており、
さらに、$ ls -l /etc/alternatives/awk で調べると、/usr/bin/gawkへのシンボリックリンクとなっていました。
 つまり、切り替え不要のようです。gawkのインストールで、デフォルトでgawkが動作するよう、自動的に設定されました。

6 awk正規表現の日本語対応

 さて、gawkが動作するようになったところで、awk正規表現の日本語対応がどうなるか? ・・・ここが肝心です。
 はい、ありがとうございます。やりました。narkejpさんのアドバイスどおり、日本語正規表現が動作するようになりました。
 具体的には、「/めい.んてい/」のパターン指定が、「めいたんてい」にマッチするようになりました。
 生成AIに質問したら、次のように解説します。

 gawkは、実行環境のロケール設定(例えばja_JP.UTF-8など)を読み込み、それに従って文字の扱いを変えます。このロケール情報により、UTF-8エンコードされた日本語の各文字を1つの文字として認識できます。また、gawkの内部エンジンは、マルチバイト文字をバイトの集まりとしてではなく、文字として認識し、処理します。一方、mawkは、正規表現の処理をバイト単位で行います。簡単に言うと、gawkは「文字」を認識し、mawkは「バイト」を認識します。

7 まとめ

 awk正規表現で、日本語を扱えるかどうかは、とても大きな問題です。Ubuntu24.04 LTS 環境において、awkの日本語周りに変な挙動が見られるときには、インストールされている処理系(mawk か gawk か)を疑うといいと思います。

 それでは、また次の記事で。
   goosyun