Załóżmy, że masz plik zawierający adresy IP, jeden adres w każdej linii:
10.0.10.1
10.0.10.1
10.0.10.3
10.0.10.2
10.0.10.1
Potrzebujesz skryptu powłoki, który liczy dla każdego adresu IP, ile razy pojawia się w pliku. Do poprzedniego wejścia potrzebne są następujące dane wyjściowe:
10.0.10.1 3
10.0.10.2 1
10.0.10.3 1
Jednym ze sposobów na to jest:
cat ip_addresses |uniq |while read ip
do
echo -n $ip" "
grep -c $ip ip_addresses
done
Jednak naprawdę nie jest to wydajne.
Jak rozwiązalibyście ten problem bardziej efektywnie za pomocą bash?
(Jedną rzecz do dodania: wiem, że można to rozwiązać z Perla lub awk, interesuje mnie lepsze rozwiązanie w bash, a nie w tych językach).
DODATKOWE INFORMACJE:
Załóżmy, że plik źródłowy ma 5 GB, a komputer z algorytmem ma 4 GB. Sortowanie nie jest więc skutecznym rozwiązaniem, ani odczytywanie pliku więcej niż jeden raz.
Podobało mi się rozwiązanie przypominające hashtable - ktoś może ulepszyć to rozwiązanie?
INFORMACJE DODATKOWE # 2:
Niektórzy ludzie pytali, dlaczego miałbym zawracać sobie tym głowę, kiedy jest to o wiele łatwiejsze, np. W Perlu. Powodem jest to, że na maszynie musiałem zrobić ten perl nie był dla mnie dostępny. Była to specjalnie zbudowana maszyna linuksowa bez większości narzędzi, do których jestem przyzwyczajony. Myślę, że to był interesujący problem.
Więc proszę, nie obwiniaj tego pytania, po prostu zignoruj je, jeśli ci się nie podoba. :-)