どうも、シローです。
AWKの練習問題も終盤、今回は配列の使い方についてです。
配列と連想配列
宣言の仕方
変数名[インデックス]=値
の形で宣言します。
1.awk
1 2 3 4 5 |
BEGIN { pokemons[1] = "pikachou"; pokemons[2] = "rizardon"; pokemons[3] = "myutsu"; } |
配列はfor
文やwhile
文で繰り返し呼び出すことができます。
2.awk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
BEGIN { pokemons[1] = "pikachou"; pokemons[2] = "rizardon"; pokemons[3] = "myutsu"; for (i = 1; i <= 3; i++) { print i, pokemons[i]; } i = 1; while (i <= 3) { print i, pokemons[i]; i++; } } |
実行:
1 2 3 4 5 6 7 |
# awk -f 2.awk 1 pikachou 2 rizardon 3 myutsu 1 pikachou 2 rizardon 3 myutsu |
連想配列の宣言の仕方
配列のインデックスを数字から文字列にするだけです。
3.awk
1 2 3 4 5 |
BEGIN { pokemon_of["fire"] = "rizardon"; pokemon_of["water"] = "kamekkusu"; pokemon_of["leaf"] = "fushigibana"; } |
要素を読み出すにはfor ~ in
というfor文を使います。
4.awk
1 2 3 4 5 6 7 8 9 |
BEGIN { pokemon_of["fire"] = "rizardon"; pokemon_of["water"] = "kamekkusu"; pokemon_of["leaf"] = "fushigibana"; for (i in pokemon_of) { print i, pokemon_of[i]; } } |
実行:
1 2 3 4 |
# awk -f 4.awk water kamekkusu fire rizardon leaf fushigibana |
便利な関数たち
配列の要素数を取得:length()
配列の要素数を取得するにはlength()
関数を使います。
5.awk
1 2 3 4 5 6 7 8 9 |
BEGIN { pokemons[1] = "pikachou"; pokemons[2] = "rizardon"; pokemons[3] = "myutsu"; for (i = 1; i <= length(pokemons); i++) { print i, pokemons[i]; } } |
実行:
1 2 3 4 |
# awk -f 5.awk 1 pikachou 2 rizardon 3 myutsu |
文字列を分割して配列に変換:split()
配列に要素を一つずつ入れていくのがめんどくさい。
そういう場合にはsplit()
関数を使って文字列を配列に展開できます。
6.awk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
BEGIN { pokemon_str = "pikachu rizardon myutsu"; # 第一引数に文字列、第二引数に展開したい配列 split(pokemon_str, pokemons); for(i = 1; i <= length(pokemons); i++) { print i, pokemons[i]; } pokemon_str_2 = "pikachu,rizardon,myutsu"; # 第三引数に区切りたい文字を入力 split(pokemon_str_2, pokemons_2, ","); for(i = 1; i <= length(pokemons_2); i++) { print i, pokemons_2[i]; } } |
実行:
1 2 3 4 5 6 7 |
# awk -f 6.awk 1 pikachu 2 rizardon 3 myutsu 1 pikachu 2 rizardon 3 myutsu |
多次元配列
多次元配列を表現したい場合はインデックスをカンマ区切りにすることで可能です。
7.awk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
BEGIN { pokemons[1, 1] = "fushigidane"; pokemons[1, 2] = "fushigisou"; pokemons[1, 3] = "fushigibana"; pokemons[2, 1] = "hitokage"; pokemons[2, 2] = "rizard"; pokemons[2, 3] = "rizardon"; pokemons[3, 1] = "zenigame"; pokemons[3, 2] = "kameel"; pokemons[3, 3] = "kamekkusu"; for (i = 1; i <= 3; i++) { for (j = 1; j <= 3; j++) { print i, j, pokemons[i, j]; } } } |
実行:
1 2 3 4 5 6 7 8 9 10 |
# awk -f 7.awk 1 1 fushigidane 1 2 fushigisou 1 3 fushigibana 2 1 hitokage 2 2 rizard 2 3 rizardon 3 1 zenigame 3 2 kameel 3 3 kamekkusu |
「シェル芸」に効く!AWK処方箋
コマンドであり軽量言語(LL)の元祖でもあって、
シェルでのテキストデータ処理には便利で手放せない
「AWK」の魅力と書き方、シェルコマンドと組み合わせた
テクニック(シェル芸)を解説!
コマンドであり軽量言語(LL)の元祖でもあって、
シェルでのテキストデータ処理には便利で手放せない
「AWK」の魅力と書き方、シェルコマンドと組み合わせた
テクニック(シェル芸)を解説!