Предположим, у вас есть файл, содержащий IP-адреса, по одному адресу в каждой строке:
10.0.10.1
10.0.10.1
10.0.10.3
10.0.10.2
10.0.10.1
Вам нужна оболочка script, которая подсчитывает каждый IP-адрес, сколько раз он появляется в файле. Для предыдущего ввода вам нужен следующий вывод:
10.0.10.1 3
10.0.10.2 1
10.0.10.3 1
Один из способов сделать это:
cat ip_addresses |uniq |while read ip
do
echo -n $ip" "
grep -c $ip ip_addresses
done
Однако это действительно неэффективно.
Как бы вы более эффективно решали эту проблему с помощью bash?
(Одна вещь для добавления: я знаю, что ее можно решить с помощью perl или awk, меня интересует лучшее решение в bash, а не на этих языках.)
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
Предположим, что исходный файл равен 5 ГБ, а машина, работающая с алгоритмом, имеет 4 ГБ. Таким образом, сортировка не является эффективным решением, и не читает файл более одного раза.
Мне понравилось хэш-табличное решение - кто-нибудь может улучшить это решение?
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ № 2:
Некоторые люди спрашивали, зачем мне это делать в bash, когда это проще, например, Perl. Причина в том, что на машине я должен был сделать это, я не был доступен для меня. Это была специально построенная Linux-машина без большинства инструментов, к которым я привык. И я думаю, что это была интересная проблема.
Итак, пожалуйста, не обвиняйте этот вопрос, просто игнорируйте его, если вам это не нравится.: -)