Angenommen, Sie haben eine Datei mit IP-Adressen, eine Adresse in jeder Zeile:
10.0.10.1
10.0.10.1
10.0.10.3
10.0.10.2
10.0.10.1
Sie benötigen ein Shell-Skript, das für jede IP-Adresse zählt, wie oft sie in der Datei angezeigt wird. Für die vorherige Eingabe benötigen Sie die folgende Ausgabe:
10.0.10.1 3
10.0.10.2 1
10.0.10.3 1
Eine Möglichkeit, dies zu tun, ist:
cat ip_addresses |uniq |while read ip
do
echo -n $ip" "
grep -c $ip ip_addresses
done
Es ist jedoch weit davon entfernt, effizient zu sein.
Wie würden Sie dieses Problem mit bash effizienter lösen?
(Eine Sache zum Hinzufügen: Ich weiß, dass es von Perl oder Awk gelöst werden kann. Ich bin an einer besseren Lösung in Bash interessiert, nicht in diesen Sprachen.)
ZUSÄTZLICHE INFORMATION:
Angenommen, die Quelldatei ist 5 GB groß und der Computer, auf dem der Algorithmus ausgeführt wird, verfügt über 4 GB. Sortieren ist also keine effiziente Lösung, und die Datei wird auch nicht mehr als einmal gelesen.
Ich mochte die Hashtable-ähnliche Lösung - kann jemand Verbesserungen an dieser Lösung vornehmen?
ZUSÄTZLICHE INFO # 2:
Einige Leute fragten, warum ich mir die Mühe machen würde, es in Bash zu machen, wenn es in Perl viel einfacher ist. Der Grund ist, dass auf der Maschine, die ich machen musste, diese Perl für mich nicht verfügbar war. Es war eine speziell angefertigte Linux-Maschine ohne die meisten Tools, die ich gewohnt bin. Und ich denke, es war ein interessantes Problem.
Also bitte, beschuldigen Sie die Frage nicht, ignorieren Sie sie einfach, wenn Sie sie nicht mögen. :-)