awk の連想配列

連想配列は, 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 からインクリメントするから, キーの数を表すことになる.

Table Of Contents

Previous topic

awk の配列

Next topic

ユーザ定義関数