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

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

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

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

AWKで文字列を1文字ずつのフィールドに分解する方法

 


1 文字列を1文字ずつに分解する方法

 テキスト処理言語AWK(オーク)の使い方で、私が長いこと抱いていた疑問が、解決されました。ものの見事に解決されたので、まさに「氷解」という表現がピッタリです。
 それぐらい気持ちのよい、スカッとする解決でした。
 この件は先日、一度ブログ記事にしたのですが、私にとってちょっとした感動だったので、改めて、今度はしっかりと自分の言葉で、記事にまとめることにしました。
 疑問点だったのは、区切り文字となるようなものが特にない単なる文字列を、1文字ずつに分解する方法はないものだろうか、というものです。
 AWKを使えば、それができることが分かりました。AWKには、その方法が用意されていたのです。
 んで、文字列を1文字ずつに分解する方法とは・・・、その答えは・・・、
  「空文字("")をフィールドセパレータにする。」です。
 文字列中の文字と文字と間には、空文字("")が存在します。長さ0の文字列です。ですから、その空文字をフィールドセパレータにすればよいのです。そうすれば、1文字ずつのフィールドとなります。これはもう、「なるほど。」って言わずにおれません。これを最初に発見した人というか、このことを思いついた人は、頭のよい人でしょうねぇ。それは、AWK言語の作者らかもしれません。

プログラミング言語AWK(第2版)」 これでバッチリ!

2 オプションの一般的記述方法

 AWKでは、フィールドセパレータの指定のために、-Fオプションが用意されています。
 -Fオプションの引数として指定した値(文字や記号等)がセパレータ(区切り文字)になります。コロン(:)をセパレータにしたいときには、引数にコロンを指定して、-Fオプションに渡します。
 一般的に、オプション名とオプション引数の間は、半角スペースを挿入してもよいし、半角スペースの省略も可能です。
  半角スペースで区切って、「awk -F ":"」 としても、
  オプション名と引数をくっつけて、「awk -F":"」としても、
その両方が許容されています。


3 空文字をオプション引数とする場合の注意点

 一般的には上記2項のとおりなのですが、空文字を-Fオプションの引数とする場合だけは注意が必要です。-Fの直後に、半角スペースの挿入が必ず必要となります。オプション名-Fと、引数の空文字("")をくっつけて、「awk -F""」とすると、シェルによって空文字("")はないものと解釈されてしまいます。そうすると、オプション引数がなくなってしまう、あるいは、半角スペースで区切られた次の文字列がオプション引数と解釈されてしまいます。
 ですから、-Fの後ろに半角スペースを置き、その半角スペースの後ろに来る文字列(この場合、空文字の「""」)がオプション引数であることを、しっかり明示する必要があります。


4 まとめ(記述例)

 -Fオプションを使ったawkコマンドを、実際にいくつか記述してみます。
  (1) $ echo "a:i:u:e:o" | awk -F":" '{print $2,$3}'  #-F直後に半角スペースなし
  (2) $ echo "a:i:u:e:o" | awk -F ":" '{print $2,$3}'  #-F直後に半角スペースあり
  (3) $ echo "aiueo" | awk -F"" '{print $2,$3}'  #-F直後に半角スペースなし
  (4) $ echo "aiueo" | awk -F "" '{print $2,$3}'  #-F直後に半角スペースあり

 上記4例のうち、(1)(2)(4)は正常動作します。実行の結果、期待どおりに「i」と「u」が抽出されます。
 それに対し、(3)は実行されません。(3)の実行がされない理由は、第3項に記載のとおりです。
 この結論を押さえておくだけでも、十分に通用するでしょう。でも今回は、理屈まで理解できました。これで、知識としてしっかり定着させることができたように思います。おそらく、すぐには忘れないでしょうし、もし忘れたとしても、思い出すのは容易のような気がします。


5 おまけ(補足)

 -Fオプションを使用せずに、フィールドセパレータに空文字を指定する方法もあります。それは、次のように記述します。
 $ awk 'BEGIN{FS=""} {print $2,$3}'
 フィールドセパレータのために用意された組み込み変数「FS」に、空文字("")を代入する方法です。「FS=""」と明示した方が、ぱっと見、分かりやすいとは言えます。

 

AWKの定番教科書「プログラミング言語AWK(第2版)

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