2016-08-22 10 views
2

Ich habe eine Datei, die wieBash - Duplikate entfernen, um bewahren

1254543534523233434 
3453453454323233434 
2342342343223233535 
0909909092324243535 

sieht Gibt es eine Möglichkeit/Befehl in bash Duplikate auf die Datei oben zu entfernen, basierend auf einem bestimmten Teilkette, ohne ihre Reihenfolge ändert in die Ausgabe?

dh

(mit Teilzeichen -> $ {line: 11: 8}

1254543534523233434 
2342342343223233535 
0909909092324243535 

Ich weiß, dass:

sort -u : sorts them numerically, then removes duplicates 
sort -kx,x -u : The same 
cat filein | uniq : requires them to be sorted already or it will not work 

Ich versuche, herauszufinden, ob es eine native ist Linux-Lösung, ohne zu Perl-Code für sie zu lösen Vielen Dank im Voraus

+0

Dies ist nicht ein exaktes Duplikat. Es hat die zusätzliche Einschränkung, Zeilen nur auf einer Unterzeichenfolge zu vergleichen, aber die gesamte Zeile zu drucken. Allerdings sollte die [Antwort] (http://stackoverflow.com/questions/1444406/how-can-i-delete-duplicate-lines-in-a-file-in-unix) leicht erweiterbar sein auf "awk" ! gesehen [substr ($ 0, 11, 8)] ++ 'file.txt'. –

Antwort

3

Sie können Awk ohne verwenden müssen Sortierung:

awk '!uniq[substr($0, 12, 8)]++' file 

1254543534523233434 
2342342343223233535 
0909909092324243535 
  • Da awk Index von 1 startet müssen Sie substr($0, 12, 8) verwenden, um 8 Zeichen vom 12. Startplatz Langtext gewünscht zu erhalten.
  • uniq ist ein assoziatives Array mit Teilstring, das unter Verwendung der substr-Funktion abgerufen wird.
  • ++ Sätze Wert von Array als 1
+1

Das hat perfekt funktioniert, danke. – onlyf

Verwandte Themen