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

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

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

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

AWKのパターンに変数を使用(シェルスクリプトの引数として指定した文字列でデータ検索)

 


1 正規表現を使った部分一致検索

 テキスト処理のためのプログラミング言語AWKは、正規表現に対応しています。
 AWKは、
   awk  'パターン{アクション}'  <入力ファイル>
という形で実行しますが、そのパターンに正規表現が使えるのです。
 その正規表現を利用すれば、部分一致検索が容易です。
 パターンの箇所に「$3 ~ /(部分文字列)/」という形で記述すると、第3フィールドのデータが部分文字列を含む場合に一致します。
 「~」(チルダ)が照合演算子で、左辺と右辺が「一致する」(左辺の文字列が右辺の部分文字列を「含む」)を意味します。
 例えば、第3フィールドが「きめつのやいば」となっていれば、「$3 ~ /やいば/」 というパターンに一致します。「きめつのやいば」が、部分文字列「やいば」を含むからです。このように正規表現の照合演算子を使うときは、部分文字列をスラッシュで囲みます。これで、部分一致検索ができます。

2 シェルスクリプトによってデータ検索

 上記のことを利用して、部分一致検索用のシェルスクリプトを作ることにしました。
 シェルスクリプトの引数として指定した文字列を含むデータを検索するスクリプトです。シェルスクリプトの引数は$1という変数に格納されるので、この変数に格納されている文字列と部分一致するデータを検索しようとするものです。
 んで、作成したスクリプトは、次のとおりです。
 awk -v pattern="$1" '$3 ~ /pattern/' data.txt
 このスクリプトファイルを、kensaku.sh という名前で保存し、「chmod +x」コマンドで実行権限を付与しました。
 ターミナルで、「kensaku.sh やいば」と打てば、「1 鬼滅の刃 きめつのやいば」の検索結果が出てくる・・・・はずです。・・・のはずなのに、正常に実行されません。・・・ん???、どうして?

awkを使ったプログラミング

3 AIによる解決とその解説

 あちこちのサイトをググって解決策を探し回りましたが、今一つよく分かりません。
 そこで、AIに尋ねました。
 AIが提示してくれたコードは、次のとおりです。
  【誤】 awk -v pattern="$1" '$3 ~ /pattern/' data.txt
  【正】 awk -v pattern="$1" '$3 ~ pattern' data.txt
 そして、次のように解説してくれました。
 awk正規表現マッチングには、大きく分けて2つの方法があります。
 (1)リテラル(直接指定)による正規表現
    /パターン/ のようにスラッシュで囲って直接パターンを記述する方法です。 例:$3 ~ /やいば/
 (2)変数による正規表現
    awkの変数に正規表現パターンを格納し、その変数を使ってマッチングする方法です。 例:$3 ~ pattern
 今回のコードでは、-vオプションによって、シェルから渡された文字列がawkの内部変数patternに格納されています。このpattern変数は、すでに正規表現として扱える状態になっています。
 そのため、$3 ~ patternと記述するだけで、awkは「$3フィールドが、pattern変数に格納されている正規表現に一致するかどうか」をチェックしてくれます。
 awk正規表現マッチングで変数を使う場合は、スラッシュで囲まずに変数名を直接指定するというルールを覚えておくと良いでしょう。

4 まとめ

 「awk正規表現マッチングで変数を使う場合は、スラッシュで囲まずに変数名を直接指定する。」というルール、勉強になりました。理屈を抜きにして、ルールとして覚えることにします。

 

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