今回は、awkコマンドで実行される処理ブロックと変数の初期化を実行するブロックについてご紹介したいと思います。
awkで実行されるブロック処理の構文
awkの処理は大きく分けて、下記の3つのブロックの単位で処理を書くことができます。
1. BEGINブロック
2. メインブロック
3. ENDブロック
下記の形式が基本的な構文の書き方になります。
cat ファイル名 | awk '
BEGIN{
〜BEGINブロックの処理〜
}
{
〜メインブロックの処理〜
}
END{
〜ENDブロックの処理〜
}
'
awkで実行されるブロック処理の順番
awkのブロック処理の順番としては、構文の名前の通り、下記の順番で実行されます。
1. BEGINブロック
2. メインブロック
3. ENDブロック
※それぞれの処理のブロックは省略することもできます。
最初に実行されるBEGINブロックで変数の初期化を行うのが基本
まず最初に、awkコマンドを実行すると、BEGINブロックの処理が実行されます。
基本は、最初に実行されるBEGINブロックで変数の処理を実行すると良いかと思います。
基本的にはBEGINブロックで変数を初期化するとしておけば、ソースコードもわかりやすくなり混乱することもなくなり、バグの防止にもつながると思います。
awkのサンプルコード
下記のように、in.txtがあるとします。in.txtの2列目の総和を求めるawkのスクリプトをサンプルコードとしてご紹介します。
$ cat in.txt line1 4 line2 8 line3 9
下記がサンプルコードになります。
$ cat sample.awk
#!/bin/sh
cat in.txt | awk '
BEGIN{
print "BEGINブロックの処理を実行"
print " 変数の初期化"
sum = 0
}
{
print NR "行目を実行"
sum += $2
}
END{
print "ENDブロックの処理を実行"
print " 2列目の総和=" sum
}
'
下記が実行結果になります。BEGINブロック→メインブロック→ENDブロックの順番で実行されるているのが確認できます。
$ ./sample.awk BEGINブロックの処理を実行 変数の初期化 1行目を実行 2行目を実行 3行目を実行 ENDブロックの処理を実行 2列目の総和=21
awkのサンプルコードの解説
簡単にサンプルコードの解説をしたいと思います。
まずは、BEGINブロックで変数sumに0を代入して初期化をしています。
BEGIN{
print "BEGINブロックの処理を実行"
print " 変数の初期化"
sum = 0
}
続いて、メインブロックでは、変数sumに2列目を加算していきます。
{
print NR "行目を実行"
sum += $2
}
最後に、ENDブロックで総和をprint出力しています。
END{
print "ENDブロックの処理を実行"
print " 2列目の総和=" sum
}
