Suponha que você tenha um arquivo que contenha endereços IP, um endereço em cada linha:
10.0.10.1
10.0.10.1
10.0.10.3
10.0.10.2
10.0.10.1
Você precisa de um script de shell que conte para cada endereço IP quantas vezes ele aparece no arquivo. Para a entrada anterior, você precisa da seguinte saída:
10.0.10.1 3
10.0.10.2 1
10.0.10.3 1
Uma maneira de fazer isso é:
cat ip_addresses |uniq |while read ip
do
echo -n $ip" "
grep -c $ip ip_addresses
done
No entanto, está realmente longe de ser eficiente.
Como você resolveria esse problema com mais eficiência usando o bash?
(Uma coisa a acrescentar: eu sei que pode ser resolvido a partir de perl ou awk, estou interessado em uma solução melhor no bash, não nesses idiomas.)
INFORMAÇÃO ADICIONAL:
Suponha que o arquivo de origem tenha 5 GB e a máquina executando o algoritmo tenha 4 GB. Portanto, classificar não é uma solução eficiente, nem ler o arquivo mais de uma vez.
Gostei da solução semelhante à hashtable - alguém pode oferecer melhorias nessa solução?
INFORMAÇÕES ADICIONAIS # 2:
Algumas pessoas perguntaram por que eu me incomodaria em fazê-lo no bash, quando é muito mais fácil, por exemplo, em perl. O motivo é que na máquina que eu tinha que fazer esse perl não estava disponível para mim. Era uma máquina Linux customizada, sem a maioria das ferramentas que estou acostumada. E acho que foi um problema interessante.
Então, por favor, não culpe a pergunta, apenas a ignore se não gostar. :-)