awkのレコードと組み込み変数NRについて

awkにはレコードという概念があります。これは文字通り行のことで、awkは行単位でパターンマッチの判定、アクションの実行を行います。このように行を処理の単位とすることは他のUnixコマンドでも見られることなので、awkを普通に使う分には特に意識する必要はないでしょう。
ところで、awkにはこの行に関する組み込み変数NRがあります。 この記事ではこの変数の意味と使い方について紹介します。

NR(Number of Records)

NRとはNumber of Recordsの略で、詰まるところ行数のことです。その行が何行目なのかを表示してくれます。百聞は一見にしかず、早速見てみましょう。

$ seq 1 10 | awk '{print "number: " NR}'
number: 1
number: 2
number: 3
number: 4
number: 5
number: 6
number: 7
number: 8
number: 9
number: 10

このように、処理している行が何行目なのか表示されます。まあこの例ではNRの部分を$0とかにしても全く同じ出力になるんですけどね。疑り深い方はawkコマンドの前にtacコマンドを挟んだりすれば納得してくれることでしょう。

使い道

NRの使い道はズバリ、行によって処理を分岐させたい時です。例えば、3行目までだけ表示させたいなら以下のように書けます。

$ seq 1 10 | awk 'NR<=3'
1
2
3

(なんでprintが省略できるか疑問に思った方は拙記事をお読みください。)

blog.kanezoh.com.

まあ別に上から何行を取り出したいみたいな処理の場合はわざわざawkを使わなくてもheadとかで十分ですね。もう少し有用なユースケースとしては偶数行の時だけ処理をしたいとかそんなケースでしょうか。

$ seq 1 10 | awk 'NR%2==0'
2
4
6
8
10

NRは組み込み変数とは言っても単なる数字なので、条件式に組み込んで柔軟にパターンを構築することができます。
それでは、良いawkライフを!