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 鬼滅の刃 きめつのやいば」の検索結果が出てくる・・・・はずです。・・・のはずなのに、正常に実行されません。・・・ん???、どうして?

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
