awkのNR変数で行数に応じた処理をする

スポンサーリンク

awkの組み込み変数NR

※awkの使い方をまとめて一覧にしました。
参考:awk入門-使い方まとめ一覧-

NR変数で、処理中の行数が取得できます。
便利な変数です。

※MACターミナル(BSD系)での動作確認です。

例えば、下記のin.txtがあったとします。

 $ cat in.txt 
L1,awk,3
L2,find,7
L3,grep,9
L4,grep,6

print出力で、NR変数を出力してみます。
先頭に処理中の行数を付与しています。
 $ cat in.txt | awk -F"," '{print NR "行目を処理" , $0}'
1行目を処理 L1,awk,3
2行目を処理 L2,find,7
3行目を処理 L3,grep,9
4行目を処理 L4,grep,6

例えば、特定の行数のみ表示したい場合、今回は2行目を表示してみます。
 $ cat in.txt | awk -F"," 'NR == 2{print NR "行目を処理" , $0}'
2行目を処理 L2,find,7

スポンサーリンク

NR変数を使ったサンプルコード

いくつかサンプルコードを載せてみます。

2行目以降の3列目の総和を求める。

参考:grepを使って行単位で処理するのも便利です
参考:grepとawkのワンライナーで特定の行と列を指定して総和を算出

 $ cat in.txt | awk -F"," 'NR >= 2{sum += $3} END{print "sum=" sum}'
sum=22

丁寧にif分を使って、スクリプトを書いてみました。
参考:awkのif文のサンプルコード
2行目と4行目の行をprint出力しています。
 $ cat sample.awk 
#!/bin/sh
cat in.txt | awk '		
	BEGIN{
		OFS = " ,"
	}
	{
		if(NR == 2 || NR == 4){
			print NR ,$0
		}
	}
'

下記が実行結果になります。
 $ ./sample.awk 
2 ,L2,find,7
4 ,L4,grep,6

スポンサーリンク