Предположим, у вас есть файл, который содержит IP-адреса, по одному адресу в каждой строке:
10.0.10.1
10.0.10.1
10.0.10.3
10.0.10.2
10.0.10.1
Вам нужен сценарий оболочки, который подсчитывает для каждого 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. Причина в том, что на машине, которую я должен был сделать, этот Perl был недоступен для меня. Это была специально созданная машина Linux без большинства инструментов, к которым я привык. И я думаю, что это была интересная проблема.
Поэтому, пожалуйста, не вините вопрос, просто проигнорируйте его, если он вам не нравится. :-)