外からawkに引数で値を渡してあげる方法として、2通りの方法があります。
今回は、その方法を紹介したいと思います。

スポンサーリンク

-vオプションでawkに値を渡す

※awkの使い方をまとめて一覧にしました。
参考: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オプションで統一するようにしています。

スポンサーリンク