連想配列は, C 言語にもない独特の配列である. C++ や perl など比較的新しい言語には同様の実装が成されている.
連想配列は数ではなく文字列を, 添字 (そえじ) にしたもので, 使い方を覚えれば実にユニークなテキスト処理のツールに成る:
配列名[キー] = 値 # 値は文字列か数値か
scpt17_1.awk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/usr/local/bin/gawk -f
# scpt17_1.awk
BEGIN{
meibutsu["大阪"] = "たこやき"
meibutsu["名古屋"] = "きしめん"
meibutsu["福岡"] = "辛子明太子"
meibutsu["静岡"] = "お茶"
print "大阪の名物は: " meibutsu["大阪"]
print "名古屋の名物は: " meibutsu["名古屋"]
print "福岡の名物は: " meibutsu["福岡"]
print "静岡の名物は: " meibutsu["静岡"]
}
|
scpt17_1.awk の実行結果は:
[cactus:~/code_awk/tuts]% ./scpt17_1.awk
大阪の名物は: たこやき
名古屋の名物は: きしめん
福岡の名物は: 辛子明太子
静岡の名物は: お茶
scpt17_2.awk
1 2 3 4 5 6 7 8 9 10 11 12 | #!/usr/local/bin/gawk -f
# scpt17_2.awk
BEGIN{
meibutsu["大阪"] = 5
print "大阪の名物は: " meibutsu["大阪"] "個ある."
meibutsu["大阪"] += 1
print "大阪の名物は: " meibutsu["大阪"] "個になった."
}
|
scpt17_2.awk の実行結果は:
[cactus:~/code_awk/tuts]% ./scpt17_2.awk
大阪の名物は: 5個ある.
大阪の名物は: 6個になった.
連想配列に対してすべての要素を数える:
for(仮引数 in 連想配列名)
処理
scpt17_4.awk
#!/usr/local/bin/gawk -f
# scpt17_4.awk
BEGIN{
meibutsu["大阪"] = "たこやき"
meibutsu["名古屋"] = "きしめん"
meibutsu["福岡"] = "辛子明太子"
meibutsu["静岡"] = "お茶"
for(key in meibutsu){ # key を仮引数として設定
print key "の名物は: " meibutsu[key] # 設定した仮引数 key を用いる
}
}
scpt17_4.awk の実行結果は:
[cactus:~/code_awk/tuts]% ./scpt17_4.awk
大阪の名物は: たこやき
名古屋の名物は: きしめん
静岡の名物は: お茶
福岡の名物は: 辛子明太子
scpt17_5.awk
#!/usr/local/bin/gawk -f
# scpt17_5.awk
{
for(i = 1; i <= NF; i++)
appear[$i]++
}
END{
for(key in appear){
print key ": " appear[key]
n++
}
print "総計は: " n " 語"
}
scpt17_5.awk の実行結果は:
[cactus:~/code_awk/tuts]% ./scpt17_5.awk data17_5.txt
book: 1
pen: 1
a: 2
This: 1
yours: 1
mine: 1
It: 2
That: 1
is: 4
総計は: 9 語
まずこのでは, 本処理の部分で, 入力行の各フィールドの単語をキーとする連想配列を作ろう.
例えば, ファイルの第一行目を読んで, for 文のループを実行するが, i が 1 のときは, 下のようになる:
appear[$1]++
今, $1 は “this” であるので, これは実際は:
appear["this"]++
である.
従って, 第一行目 (This is a book) を読んだときのスクリプトの実行状態を具体的に表せば, 以下のようになる:
appear["This"]++; appear["is"]++; appear["a"]++; appear["book"]++;
このとき連想配列は四つ作られて, それぞれ 1 という値を持つようになる. 次に 2 行目を読んだときは:
appear["It"]++; appear["is"]++; appear["mine"]++;
こうなる. このとき, appear[“is”] はすでに作られている変数なので, インクリメントされるで, 値は 2 になる. その他は新しく作られて, 値は 0 から 1 にインクリメントされる.
このように, 初めてでてくる単語については, それをキーとする連想配列変数が作られインクリメントされる.
3 行目では, 新たに2つ作られて, 2つはインクリメントされるだけ:
appear["That"]++; appear["is"]++; appear["a"]; appear["pen"]++;
4 行目では, 一つが新しく作られ, 2つがインクリメントされるだけである:
appear["It"]++; appear["is"]++; appear["yours"]++
n++ は一つのキーを処理するたびに 0 からインクリメントするから, キーの数を表すことになる.