awkには標準関数で、文字列を置換する関数gsub()が用意されています。
とても便利な関数なので紹介してみたいと思います。
スポンサーリンク
gsub()の使い方
参考:awk入門-使い方まとめ一覧-
下記の書式で、入力文字列を入力として、置換対象文字列を置換文字列に置換します。
gsub(置換対象文字列, 置換文字列, 入力文字列)
例えば、1フィールド(列)目の文字列"-"を"/"に置換したい場合は、下記のように書きます。
gsub( "-", "/", $1 )
この時、入力文字列変数の$1は直接置換されてしまいますので、注意が必要です。
置換対象文字列の指定には正規表現も使えます。
サンプルコード
それではサンプルコードです。
in.txtは下記の用に、日付と天気が書かれています。
$ cat in.txt 2017-12-16 雨 2017-12-17 曇り 2017-12-18 晴れ
sample.awkには、1レコード(行)ずつ読み込んで、1フィールド(列)目の文字列"-"を"/"に置換しています。
そして、置換した1フィールド(列)目と2フィールド(列)目をprint出力しています。
$ cat sample.awk #!/bin/sh cat in.txt | awk ' { gsub( "-", "/", $1 ) print $1 , $2 } '
実行すると、下記のように"-"が"/"に置換されています。
$ ./sample.awk 2017/12/16 雨 2017/12/17 曇り 2017/12/18 晴れ
スポンサーリンク
gsub()は正規表現を使って置換もできる
gsub()は正規表現を使うこともできます。
例えば、下記のようにin.txtがあったとします。
$ cat in.txt 123awk 456ls 7890find
下記のように、1レコード(行)ずつ読み込んで、数字を空文字に置換します(数字を削除することになります)。
0~9の数字は、正規表現で[0-9]と表現できます。
$ cat sample.awk #!/bin/sh cat in.txt | awk ' { gsub( /[0-9]/, "", $0 ) print $1 , $2 } '
下記が実行結果になります。数字が空文字に置換されて、数字が削除さているのが確認できます。
$ ./sample.awk awk ls find
スポンサーリンク
gsub()で先頭と語尾の文字列を置換したい場合
例えば、ファイルの行の先頭や語尾にゴミデータがあり、それを削除したい場合があると思います。
先頭や語尾も、正規表現で指定できますので、gsub()でうまく削除できることが多いです。
下記に参考記事を書いていますので、良ければ参照してみてください。
awkで先頭・語尾の文字列置換をしたい時は、正規表現とgsub()で解決
awkのgsub()とsub()の違いは?
置換関数としてgsub()の他にsub()がawkにはあります。
awkのgsub()とsub()の違いは置換回数の回数制約にあります。
gsub()は全ての置換対象文字列を置換、sub()は最初の置換対象文字列一回のみ置換します。
下記に参考記事を書いています。よければ参照してください。
参考:awkのgsub()とsub()の違いは置換回数の回数制約
n回目に出現した文字列を置換
n回目に出現した文字列を置換する場合には、gensub()を使います。
入力文字列に対して、n番目に出現した置換対象文字列を置換文字列で置換します。
r = gensub( 置換対象文字列, 置換文字列, n, 入力文字列 )
スポンサーリンク