Mit GNU uniq, das die -w
Option unterstützt :
$ cat data zikla13:Oct:20:22:34 zikla13:Oct:5:00:31 zikla14:Oct:17:22:01 zikla14:Oct:12:23:35 zikla14:Oct:12:23:34 zikla14:Oct:12:00:11 zikla14:Oct:11:23:52 zikla14:Oct:5:22:22 zilka13:Oct:13:23:48 zilka13:Oct:11:00:28 zilka13:Oct:9:22:40 $ uniq -c -w7 data 2 zikla13:Oct:20:22:34 6 zikla14:Oct:17:22:01 3 zilka13:Oct:13:23:48
Wie in den Kommentaren darauf hingewiesen, geht man davon aus, dass das erste Feld immer aus sieben Zeichen besteht. Dies ist in Ihrem Beispiel der Fall. Wenn es sich jedoch nicht um das reale Leben handelt, gibt es keine Möglichkeit, es mit uniq zu tun (plus, wenn Sie sich entscheiden) GNU uniq ist -w
nicht vorhanden, funktioniert sogar nicht), also hier eine Perl-Lösung:
$ perl -ne '/(.*?):(.*)/;unless (exists $x{$1}){$x{$1}=[0,$2];push @x, $1};$x{$1}[0]++;END[0],$_,$x{$_}[1]) foreach @x}' <data 2 zikla13:Oct:20:22:34 6 zikla14:Oct:17:22:01 3 zilka13:Oct:13:23:48
So funktioniert das:
$ perl -ne
Führen Sie perl aus, drucken Sie nicht jede Zeile standardmäßig und verwenden Sie das nächste Argument als Skript.
/(.*?):(.*)/
Teilen Sie die Eingabezeile in das Zeug vor dem ersten Doppelpunkt und das Zeug nach dem ersten Doppelpunkt in $1
und auf $2
. split
würde auch hier funktionieren.
unless (exists $x{$1}){$x{$1}=[0,$2];push @x, $1}
Der Hash %x
wird verwendet, um die Zeilen und das Array eindeutig zu machen @x
, um sie in der richtigen Reihenfolge zu halten (Sie könnten dies auch verwenden sort keys %x
, aber Perl sort
wird in der gleichen Weise sortiert, wie die Eingabe sortiert wird.) Wenn wir den Strom noch nie gesehen haben "key" (das Zeug vor dem ersten Doppelpunkt), initialisieren Sie einen Hash-Eintrag für die Taste und drücken Sie die Taste auf @x
. Der Hash-Eintrag für jeden Schlüssel ist ein Array mit zwei Elementen, das die Anzahl und den ersten Wert nach dem Doppelpunkt enthält. Die Ausgabe kann diesen Wert enthalten.
$x{$1}[0]++
Erhöhen Sie die Zählung.
END{
Starten Sie einen Block, der ausgeführt wird, nachdem alle Eingaben gelesen wurden.
printf("%8d %s:%s\n",$x{$_}[0],$_,$x{$_}[1])
Drucken Sie die Zählung mit Leerzeichen, einem Leerzeichen, dem "Schlüssel", einem Doppelpunkt und dem Zeugs hinter dem Doppelpunkt aus.
foreach @x}
Tun Sie das für jeden gesehenen Schlüssel in der Reihenfolge und beenden Sie den END-Block.
<data
Lesen Sie aus der Datei mit dem Namen data im aktuellen Verzeichnis, um die Eingabe zu erhalten. Sie können auch einfach in perl weiterleiten, wenn Sie einen anderen Befehl oder eine andere Pipeline für die Datenerstellung haben.