Припустимо, у вас є файл, який містить 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:
Деякі люди запитували, чому я можу це робити в баш, коли це легше, наприклад, в перл. Причина полягає в тому, що на машині мені довелося зробити, що цей perl був для мене недоступним. Це була спеціально побудована машина Linux без більшості інструментів, до яких я звик. І я думаю, це була цікава проблема.
Тому, будь ласка, не звинувачуйте це питання, просто ігноруйте його, якщо воно вам не подобається. :-)