連想配列はどのように機能しますか?

連想配列はどのように機能しますか?
bash-3.00# cat iplogs.txt
180607 093423   123.12.23.122  133
180607 121234   125.25.45.221  153
190607 084849   202.178.23.4   44
190607 084859   164.78.22.64   12
200607 012312   202.188.3.2    13
210607 084849   202.178.23.4   34
210607 121435   202.178.23.4   32
210607 132423   202.188.3.2    167

bash-3.00# awk '{ip[$3]++;} END{for (var in ip)\
print var, "access", ip[var]," times"}' iplogs.txt
202.188.3.2 access 2  times
164.78.22.64 access 1  times
202.178.23.4 access 3  times
125.25.45.221 access 1  times
123.12.23.122 access 1  time

上記の出力がわかりません。繰り返される各値を増やす方法は$3

配列に割り当てられた値は次のようipになると予想しました。

ip[123.12.23.122]=0
ip[125.25.45.221]=1

など。

だからこうしてみましたが、配列の値がip[var]出力されませんね。

bash-3.00# awk '{ip[$3]++;} END{for (var=0;var <= NR; var++)\
print var, ip[var]}' iplogs.txt
0
1
2
3
4
5
6
7
8

答え1

連想配列は、整数インデックスではなく文字列をキーとして使用します。 *この場合、キーはであり$3、これはawk3番目の(3rd)フィールドに対応するフィールド変数です。入力例では、IPv4アドレスのように見える文字列を含む3番目の列になります。式でip[$3]++あれば増加$3します。サンプル入力では合計2倍なので2倍に増加します。初期化されていないすべてのawk変数と同様に、最初から始まるので、最終値はです。"202.188.3.2"ip["202.188.3.2"]$3"202.188.3.2"ip["202.188.3.2"]02

最初の例ではを使用しますfor (var in ip)。これは、不明なキーを持つ配列を繰り返す正しい方法です。 2番目の例ではfor (var = 0; var <= NR; var++)ipIPv4 アドレスのように見える文字列いいえ整数インデックス。ip[0]、、...要素は割り当てられていないため存在しません(、、、...が割り当てられip[1]ていないため)。したがって、空の出力()が表示されます。$3012""


* ではawk整数配列インデックスが実際に最初に文字列に変換されるので、 とa[1]a["1"]同じ要素です。

関連情報