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.