awkで文字列を扱う

2016年8月1日(更新: 2016年8月1日)

文字列の切り出し・置換など

前回はawkで行(レコード)を一区切り(フィールド)に分割して処理を行う方法を紹介しました。

今回はフィールド単位ではなく、一文字単位で文字列を加工する方法を解説していきます。

文字列の切り出し(substr)

例えば、テキストファイルに書かれた「Hello!」という文字列から、3文字目以降を抜き出したいとします。

テキストファイルの中身は以下のようであるとします。

test3.txt

    Hello!
  

次のコマンドで切り出しを行います。文字の切り出しを行うには、substr関数を利用します。

    awk '{print substr($0, 3)}' test3.txt
  

実行結果

llo!

substr関数の書式は以下の通りです。

    substr(切り出す対象のフィールド, 何文字目から切り出すか, 切り出す文字数)
  

substr関数は3つの引数を受け取ります。しかし、上記の例のように切り出す文字数を制限しない場合は、3つ目の引数「切り出す文字数」を省略できます

では、今度はsubstr関数の「Hello!」から「ll」だけを取り出すawkプログラムを書いてみましょう。3文字目から2文字を切り出せばいいですね。

    awk '{print substr($0, 3, 2)}' test3.txt
  

実行結果

ll

フィールドを指定して文字を切り出す例を以下に示します。読み込むテキストファイルは以下のようであるとします。

test4.txt

    apple orange banana
  

それでは、3つ目のフィールド(banana)を選んで切り出してみます。

    awk '{print substr($3, 3)}' test4.txt
  

実行結果

nana

文字列の置換(sub)

特定のキーワードを別の文字列に変えたい場合はsub関数を使います。

以下のようなテキストファイルがあります。

test5.txt

    1231321132
  

はじめに現れる「132」を「567」に変えたいとします。

    awk '{sub("132", "567", $0); print $0}' test5.txt
  

実行結果

1235671132

以下のように書いてしまうと置換結果が表示されません。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
  

実行結果

1235671567

test5.txt の数値列の中にある2つの「132」がどちらも「567」になったことがわかります。

置換した回数を知りたい場合は、以下のようにgsub関数の前に print を書いて、gsub関数の戻り値を表示します。

    awk '{print gsub("132", "567", $0)}' test5.txt
  

実行結果

2

2回置換が行われたことがわかります。

コメントを残す

メールアドレスが公開されることはありません。