Table of Contents
文字列の切り出し・置換など
前回はawkで行(レコード)を一区切り(フィールド)に分割して処理を行う方法を紹介しました。
今回はフィールド単位ではなく、一文字単位で文字列を加工する方法を解説していきます。
文字列の切り出し(substr)
例えば、テキストファイルに書かれた「Hello!」という文字列から、3文字目以降を抜き出したいとします。
テキストファイルの中身は以下のようであるとします。
test3.txt
Hello!
次のコマンドで切り出しを行います。文字の切り出しを行うには、substr関数を利用します。
awk '{print substr($0, 3)}' test3.txt
実行結果
substr関数の書式は以下の通りです。
substr(切り出す対象のフィールド, 何文字目から切り出すか, 切り出す文字数)
substr関数は3つの引数を受け取ります。しかし、上記の例のように切り出す文字数を制限しない場合は、3つ目の引数「切り出す文字数」を省略できます。
では、今度はsubstr関数の「Hello!」から「ll」だけを取り出すawkプログラムを書いてみましょう。3文字目から2文字を切り出せばいいですね。
awk '{print substr($0, 3, 2)}' test3.txt
実行結果
フィールドを指定して文字を切り出す例を以下に示します。読み込むテキストファイルは以下のようであるとします。
test4.txt
apple orange banana
それでは、3つ目のフィールド(banana)を選んで切り出してみます。
awk '{print substr($3, 3)}' test4.txt
実行結果
文字列の置換(sub)
特定のキーワードを別の文字列に変えたい場合はsub関数を使います。
以下のようなテキストファイルがあります。
test5.txt
1231321132
はじめに現れる「132」を「567」に変えたいとします。
awk '{sub("132", "567", $0); print $0}' test5.txt
実行結果
以下のように書いてしまうと置換結果が表示されません。1という数字が表示されるだけです。
# これは間違い! awk '{print sub("132", "567", $0)}' test5.txt
sub関数の戻り値は「置換した回数」です。実行結果は $0 に保存されるので、print $0 によって結果が表示されます。
substr関数は切り出した結果が戻り値になっていましたが、sub関数はそうではないので注意が必要です。
文字列の置換2(gsub)
sub関数は、指定したキーワードに「最初に一致するもの」を置換する関数でした。一致したもの全てを置換したい場合はgsub関数を使います。
もう一度 test5.txt の「132」を置換してみましょう。
test5.txt
1231321132
gsub関数を使います。
awk '{gsub("132", "567", $0); print $0}' test5.txt
実行結果
test5.txt の数値列の中にある2つの「132」がどちらも「567」になったことがわかります。
置換した回数を知りたい場合は、以下のようにgsub関数の前に print を書いて、gsub関数の戻り値を表示します。
awk '{print gsub("132", "567", $0)}' test5.txt
実行結果
2回置換が行われたことがわかります。