awkで配列操作をする時のfor文の書き方は主に2通りの方法があります。
書き方をよく忘れるので備忘録。

スポンサーリンク

サンプルコード

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

まずはサンプルコードです。in.txtを一行ずつ読み込んで、1フィールド(列)目を配列arrに順に詰めていきます。
その後、ENDブロックで、2種類のfor文の書き方で、配列arrの要素を全てprint出力しています。

 $ cat in.txt 
e
f
g
h
i
 $ cat sample.awk 
#!/bin/sh
cat in.txt | awk '		
	BEGIN{
		i = 0
	}
	{
		arr[ i ] = $1 
		i++
	}
	END{
		print "インデックスをインクリメントとし、配列の要素を順に出力"
		for (i = 0; i < length(arr); i++ ) {
			printf "%s," , arr[ i ]
		}
		print ""
		print "for in 形式の処理で、全ての配列の要素を出力"
		for ( i in arr ) {
			printf "%s," , arr[ i ]
		}
	}
'

 $ ./sample.awk 
インデックスをインクリメントとし、配列の要素を順に出力
e,f,g,h,i,
for in 形式の処理で、全ての配列の要素を出力
g,h,i,e,f,

スポンサーリンク

for文でインデックスをインクリメントして配列操作をする

awkの配列は連想配列となっていますが、インデックスに数字を設定することで、下記のようにfor文で順に配列操作をすることができます。length()は、awkの標準関数で、引数に配列を設定するとその配列の要素数を返します。
下記のように、インデックス0からインクリメントして、その配列の要素数だけprint出力しています。

		print "インデックスをインクリメントとし、配列の要素を順に出力"
		for (i = 0; i < length(arr); i++ ) {
			printf "%s," , arr[ i ]
		}

for(インデックス in 配列){}形式で全ての配列操作をする

もう一つの配列操作の方法として、下記のようにfor(インデックス in 配列){}形式で配列処理ができます。
ただし、配列の処理順は規則性があるわけではなく、下記のprint出力の順番もソートされているわけではありません。

awkの連想配列の使い方の例を下記の記事で書いています。
参考:awkの連想配列で特定の列の文字列の出現回数をカウント

		print "for in 形式の処理で、全ての配列の要素を出力"
		for ( i in arr ) {
			printf "%s," , arr[ i ]
		}

スポンサーリンク