2016-04-13 12 views
1

Ich muss nach eindeutigen Zeilen in einer Textdatei suchen, es gibt jedoch eine zusätzliche Optimierung. Ich muss die Zeilen als Duplikate betrachten, bei denen der erste Teil (durch einen Punkt getrennt) gleich ist. Zum Beispiel:bash finde eindeutige Zeilen in einer Datei

DEASLR98 
DEASLR98.acme.it 

Diese Zeilen gleich sind, jedoch

sort file.txt | uniq 

Enthält sie beide. Irgendwelche Vorschläge, wie Sie nur die Zeile mit vollständigen Domain-Informationen (z. B. DEASLR98.acme.it) einschließen? Danke!

+0

Wenn es 'DEASLR98.foo.bar' und' DEASLR98.example.com' gibt, welches sollte man gewinnen? – tripleee

Antwort

1

Hier ist eine einfache Awk uniq Implementierung, die die längste Übereinstimmung für jede Taste hält.

awk -F . '!($1 in a) || length(a[$1]) < length($0) { a[$1] = $0 } 
    END { for (k in a) print a[k] }' file.txt 

Die -F . anweist Awk jede Eingangsleitung an Punkten aufzuteilen. So enthält $1 das Feld vor dem ersten Punkt. Wenn dieses Feld im Array a fehlt oder die Zeile länger als der vorhandene Wert für diesen Schlüssel ist, behalten wir die gesamte Eingabezeile ($0) im Array bei. Am Ende drucken wir die Werte im Array aus. Dies erfordert natürlich, dass das Array in den Speicher passt.

Verwandte Themen