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