Supposons que vous ayez un fichier contenant des adresses IP, une adresse dans chaque ligne:
10.0.10.1
10.0.10.1
10.0.10.3
10.0.10.2
10.0.10.1
Vous avez besoin d'un script shell qui compte pour chaque adresse IP le nombre de fois qu'elle apparaît dans le fichier. Pour l'entrée précédente, vous avez besoin de la sortie suivante:
10.0.10.1 3
10.0.10.2 1
10.0.10.3 1
Une façon de procéder est:
cat ip_addresses |uniq |while read ip
do
echo -n $ip" "
grep -c $ip ip_addresses
done
Mais c'est vraiment loin d'être efficace.
Comment résoudriez-vous ce problème plus efficacement en utilisant bash?
(Une chose à ajouter: je sais que cela peut être résolu depuis perl ou awk, je suis intéressé par une meilleure solution en bash, pas dans ces langues.)
INFORMATION ADDITIONNELLE:
Supposons que le fichier source mesure 5 Go et que la machine exécutant l'algorithme dispose de 4 Go. Le tri n'est donc pas une solution efficace, pas plus que la lecture du fichier plus d'une fois.
J'ai aimé la solution de type table de hachage - n'importe qui peut apporter des améliorations à cette solution?
INFORMATION SUPPLÉMENTAIRE # 2:
Certaines personnes ont demandé pourquoi je prendrais la peine de le faire en bash alors que c'est beaucoup plus facile, par exemple en perl. La raison en est que sur la machine que je devais faire, ce Perl n'était pas disponible pour moi. C'était une machine Linux construite sur mesure sans la plupart des outils auxquels je suis habitué. Et je pense que c'était un problème intéressant.
Alors s'il vous plaît, ne blâmez pas la question, ignorez-la si vous ne l'aimez pas. :-)