外からawkに引数で値を渡してあげる方法として、2通りの方法があります。
今回は、その方法を紹介したいと思います。
-vオプションでawkに値を渡す
-vオプションの使い方
例えば下記の形式で、awkの引数に設定することで、値を渡すことができます。
変数はawk内部で使う変数を設定することができます。
cat ファイル | awk -v 変数=値 '処理'
-vオプションを使ったawkのサンプルコード
例えば、in.txtが下記のように書かれていたとします。
$ cat in.txt 2015 1 1 2015 1 2
下記のように、-vオプションで3つの変数に値を設定し、awk内部に渡してあげます。
cat in.txt | awk -v strYear="年" -v strMonth="月" -v strDay="日" '
下記がサンプルコードになります。
1行ずつin.txtを読み込んで、それぞれの列の間に、引数で渡した文字列を挟んでprint出力しています。
$ cat sample.awk #!/bin/sh cat in.txt | awk -v strYear="年" -v strMonth="月" -v strDay="日" ' BEGIN{ print strYear , strMonth , strDay , "を引数で設定" } { print $1 strYear $2 strMonth $3 strDay } '
実行すると、-vオプションの引数で渡してあげた、"年" "月" "日"の3つの文字列がawk内部に渡されていて、print出力されているのが確認できます。
$ ./sample.awk 年 月 日 を引数で設定 2015年1月1日 2015年1月2日
-vオプション"なし"でawkに値を渡す
-vオプション"なし"でawkに値を渡す方法
-vオプションなしで、awkに値を渡すには、awkのシングルコーテーションで囲った処理部分の後に、変数=値の形式で書くだけです。
※ただし、-vオプション"なし"でawkに値を渡す場合には、BEGINブロックでは値の参照が行われずに、メインブロック以降の処理で参照されることに注意が必要です。
cat ファイル | awk '処理' 変数=値
awkのサンプルコード
サンプルコードになります。
先述のin.txtを読み込んで実行するサンプルコードです。
シングルコーテーションで囲った後に、3つの変数に値を設定しています。
$ cat sample2.awk #!/bin/sh cat in.txt | awk ' BEGIN{ print strYear , strMonth , strDay , "を引数で設定" } { print $1 strYear $2 strMonth $3 strDay } ' strYear="年" strMonth="月" strDay="日"
実行すると、下記のようにprint出力されます。
ただし、BEGINブロックでのprint出力の行では、strYear , strMonth , strDayの3つの変数に空となっています。
BEGINブロックでは値が渡されていないのが確認できます。
$ ./sample2.awk を引数で設定 2015年1月1日 2015年1月2日
-vオプション"あり"と"なし"の違いは?
-vオプション"あり"と"なし"の違いは、先述の動作確認でも確認できたと思いますが、
-vオプション"あり"の場合は、BEGINブロック実行時から値が渡される。
-vオプション"なし"の場合は、BEGINブロック実行時には値が渡されない。メインブロック以降で値が渡される。
-vオプション"あり"で使うようにしています。
もちろん用途によって使い分けるのも良いと思いますが、変数のスコープがわかりにくいとバグの原因になることもあると思いますので、個人的には-vオプションで統一するようにしています。