awkには標準関数で、文字列を置換する関数gsub()が用意されています。
とても便利な関数なので紹介してみたいと思います。

スポンサーリンク

gsub()の使い方

※awkの使い方をまとめて一覧にしました。
参考: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()を使います。

参考:awkのgensub()関数の使い方

入力文字列に対して、n番目に出現した置換対象文字列を置換文字列で置換します。

r = gensub( 置換対象文字列, 置換文字列, n, 入力文字列 )

スポンサーリンク