Supponiamo di avere un file che contiene indirizzi IP, un indirizzo in ciascuna riga:
10.0.10.1
10.0.10.1
10.0.10.3
10.0.10.2
10.0.10.1
È necessario uno script di shell che conti per ciascun indirizzo IP quante volte appare nel file. Per l'input precedente è necessario il seguente output:
10.0.10.1 3
10.0.10.2 1
10.0.10.3 1
Un modo per farlo è:
cat ip_addresses |uniq |while read ip
do
echo -n $ip" "
grep -c $ip ip_addresses
done
Tuttavia è davvero lungi dall'essere efficiente.
Come risolveresti questo problema in modo più efficiente usando bash?
(Una cosa da aggiungere: so che può essere risolto da perl o awk, sono interessato a una soluzione migliore in bash, non in quelle lingue.)
INFORMAZIONI ADDIZIONALI:
Supponiamo che il file sorgente sia 5 GB e che la macchina che esegue l'algoritmo abbia 4 GB. Quindi l'ordinamento non è una soluzione efficiente, né legge il file più di una volta.
Mi è piaciuta la soluzione simile a hashtable: chiunque può fornire miglioramenti a tale soluzione?
INFORMAZIONI SUPPLEMENTARI # 2:
Alcune persone hanno chiesto perché dovrei preoccuparmi di farlo in bash quando è molto più facile, ad esempio, in perl. Il motivo è che sulla macchina ho dovuto fare questo perl non era disponibile per me. Era una macchina linux su misura senza la maggior parte degli strumenti a cui sono abituato. E penso che sia stato un problema interessante.
Quindi, per favore, non dare la colpa alla domanda, ignorala se non ti piace. :-)