Matrizes associativas usam strings como chaves, não índices inteiros. * A chave neste caso é $3
, que é uma variável de campo awk
correspondente ao terceiro (3o) campo. Em sua entrada de amostra, essa seria a terceira coluna que contém sequências que se parecem com endereços IPv4. Na expressão ip[$3]++
, se $3
for "202.188.3.2"
, então ip["202.188.3.2"]
será incrementado. Como $3
é "202.188.3.2"
um total de duas vezes em sua entrada de amostra, ip["202.188.3.2"]
é incrementado duas vezes. Desde que começou em 0
no começo, como todas as variáveis awk não inicializadas, ele acaba com um valor de 2
.
Seu primeiro exemplo usa for (var in ip)
. Essa é a maneira correta de iterar em uma matriz com chaves desconhecidas. Seu segundo exemplo usa for (var = 0; var <= NR; var++)
. No entanto, como eu disse acima, ip
foi criado como um array associativo cujas chaves são strings que se parecem com endereços IPv4 , não índices inteiros. Os elementos ip[0]
, ip[1]
, ... não existem porque nunca foram atribuídos (porque em nenhum momento $3
ever 0
, 1
, 2
...), que é porque você obtém saída vazia ( ""
).
* Em awk
, índices inteiros de array são convertidos em strings, então a[1]
e a["1"]
são o mesmo elemento.