awkで配列操作をする時のfor文の書き方は主に2通りの方法があります。
書き方をよく忘れるので備忘録。
サンプルコード
まずはサンプルコードです。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 ]
}
