Supongamos que tiene un archivo que contiene direcciones IP, una dirección en cada línea:
10.0.10.1
10.0.10.1
10.0.10.3
10.0.10.2
10.0.10.1
Necesita un script de shell que cuente para cada dirección IP cuántas veces aparece en el archivo. Para la entrada anterior necesita la siguiente salida:
10.0.10.1 3
10.0.10.2 1
10.0.10.3 1
Una forma de hacer esto es:
cat ip_addresses |uniq |while read ip
do
echo -n $ip" "
grep -c $ip ip_addresses
done
Sin embargo, está muy lejos de ser eficiente.
¿Cómo resolverías este problema de manera más eficiente usando bash?
(Una cosa para agregar: sé que se puede resolver desde perl o awk, estoy interesado en una mejor solución en bash, no en esos idiomas).
INFORMACIÓN ADICIONAL:
Suponga que el archivo fuente es de 5 GB y que la máquina que ejecuta el algoritmo tiene 4 GB. Así que ordenar no es una solución eficiente, tampoco leer el archivo más de una vez.
Me gustó la solución similar a una tabla hash: ¿alguien puede proporcionar mejoras a esa solución?
INFORMACIÓN ADICIONAL # 2:
Algunas personas preguntaron por qué me molestaría hacerlo en bash cuando es mucho más fácil, por ejemplo, en Perl. La razón es que en la máquina tuve que hacer esto. Perl no estaba disponible para mí. Era una máquina Linux personalizada sin la mayoría de las herramientas a las que estoy acostumbrado. Y creo que fue un problema interesante.
Así que por favor, no culpes a la pregunta, simplemente ignórala si no te gusta. :-)