Erste Vorkommen der Gruppe im Protokoll abrufen

Erste Vorkommen der Gruppe im Protokoll abrufen

Ich habe ein riesiges Protokoll, das ich nur nach dem ersten Vorkommen jeder Gruppe filtern möchte. Im Protokoll „Gruppe“ ist alles nach dem Zeitstempel in der ersten Spalte.

Sehen Sie sich ein Beispiel an:

Mar 06 16:34:00.378;sample07;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:02.856;sample03;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;
Mar 06 16:34:03.314;sample07;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:03.525;sample07;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:04.773;sample01;0.1.0-3af8c384;A6OZwO2e9wV6Z1PI;
Mar 06 16:34:04.997;sample04;0.1.0-3af8c384;9azoPOnrcabk8Lfv;
Mar 06 16:34:05.241;sample04;0.1.0-3af8c384;9azoPOnrcabk8Lfv;
Mar 06 16:34:06.546;sample04;0.1.0-3af8c384;9azoPOnrcabk8Lfv;
Mar 06 16:34:06.671;sample08;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:07.394;sample05;0.1.0-3af8c384;JJYhwRHyTMNKM2DI;
Mar 06 16:34:07.569;sample05;0.1.0-3af8c384;JJYhwRHyTMNKM2DI;
Mar 06 16:34:09.120;sample05;0.1.0-3af8c384;JJYhwRHyTMNKM2DI;
Mar 06 16:34:09.371;sample05;0.1.0-3af8c384;JJYhwRHyTMNKM2DI;
Mar 06 16:34:09.534;sample06;0.1.0-3af8c384;tasghviiAoMrPfaZ;
Mar 06 16:34:09.662;sample04;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;
Mar 06 16:34:09.822;sample07;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;

Das erwartete Ergebnis ist:

Mar 06 16:34:00.378;sample07;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:02.856;sample03;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;
Mar 06 16:34:04.773;sample01;0.1.0-3af8c384;A6OZwO2e9wV6Z1PI;
Mar 06 16:34:04.997;sample04;0.1.0-3af8c384;9azoPOnrcabk8Lfv;
Mar 06 16:34:06.671;sample08;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:07.394;sample05;0.1.0-3af8c384;JJYhwRHyTMNKM2DI;
Mar 06 16:34:09.534;sample06;0.1.0-3af8c384;tasghviiAoMrPfaZ;
Mar 06 16:34:09.662;sample04;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;

Ich konnte die eindeutigen Kombinationen ohne Zeitstempel abrufen:

cut -d";" -f2- small_log.log | sort | uniq

Aber wie füge ich es wieder zusammen, um den Zeitstempel zu erhalten? Ich glaube auch nicht, dass sich das sort | uniqgut auf Millionen von Zeilen skalieren lässt.

Antwort1

Ich würde dies in awk tun:

$ awk -F';' '++seen[$2$3$4]==1' file 
Mar 06 16:34:00.378;sample07;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:02.856;sample03;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;
Mar 06 16:34:04.773;sample01;0.1.0-3af8c384;A6OZwO2e9wV6Z1PI;
Mar 06 16:34:04.997;sample04;0.1.0-3af8c384;9azoPOnrcabk8Lfv;
Mar 06 16:34:06.671;sample08;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:07.394;sample05;0.1.0-3af8c384;JJYhwRHyTMNKM2DI;
Mar 06 16:34:09.534;sample06;0.1.0-3af8c384;tasghviiAoMrPfaZ;
Mar 06 16:34:09.662;sample04;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;

Die Standardaktion, awkwenn etwas als wahr ausgewertet wird, besteht darin, die aktuelle Zeile zu drucken. Der Ausdruck ++seen[$1$2}macht das zweite und dritte Feld zum Schlüssel im assoziativen Array seenund erhöht seinen Wert um eins. Daher ++seen[$2$3$4]==1ist nur dann wahr, wenn diese Kombination aus dem zweiten und dritten Feld zum ersten Mal angezeigt wird.

Es handelt sich im Grunde genommen um eine Kurzschreibweise:

awk -F';' '{ 
             seen[$2$3$4]++; 
             if(seen[$2$3$4] == 1){
                print
             }
            }' file 

Alternativ können Sie es auch so machen, wie Sie es versucht haben, mit sort. Sie müssen nicht einmal cut, sondern geben einfach an, sortdass nach den Feldern 2 bis 4 sortiert werden soll und eindeutige Ergebnisse zurückgegeben werden sollen:

$ sort -t';' -k2,4 -u file 
Mar 06 16:34:04.773;sample01;0.1.0-3af8c384;A6OZwO2e9wV6Z1PI;
Mar 06 16:34:02.856;sample03;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;
Mar 06 16:34:04.997;sample04;0.1.0-3af8c384;9azoPOnrcabk8Lfv;
Mar 06 16:34:09.662;sample04;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;
Mar 06 16:34:07.394;sample05;0.1.0-3af8c384;JJYhwRHyTMNKM2DI;
Mar 06 16:34:09.534;sample06;0.1.0-3af8c384;tasghviiAoMrPfaZ;
Mar 06 16:34:00.378;sample07;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:06.671;sample08;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;

Und wenn Sie sie nach Zeitstempel sortiert benötigen, leiten Sie sie einfach sortnoch einmal weiter:

$ sort -t';' -k2,4 -u file  | sort
Mar 06 16:34:00.378;sample07;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:02.856;sample03;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;
Mar 06 16:34:04.773;sample01;0.1.0-3af8c384;A6OZwO2e9wV6Z1PI;
Mar 06 16:34:04.997;sample04;0.1.0-3af8c384;9azoPOnrcabk8Lfv;
Mar 06 16:34:06.671;sample08;0.1.0-3af8c384;WXHXdaYrHcVQYvLR;
Mar 06 16:34:07.394;sample05;0.1.0-3af8c384;JJYhwRHyTMNKM2DI;
Mar 06 16:34:09.534;sample06;0.1.0-3af8c384;tasghviiAoMrPfaZ;
Mar 06 16:34:09.662;sample04;0.1.0-3af8c384;Y2XdtYN2of7JUc4b;

verwandte Informationen