Doppelte Zeilen in der Textdatei löschen…?

7

Wie kann ich doppelte Zeilen in einer Textdatei über die Eingabeaufforderung löschen?

Zum Beispiel: Ich habe eine 10-MB-Textdatei und möchte nur eine Zeile behalten My line, aber irgendwo in der Textdatei befinden sich 2 My lineSekunden.

user95942
quelle
Ist "Meine Zeile" {enter} "Meine Zeile" genau die Wörter, die Sie ersetzen möchten, oder ist das ein Beispiel? In letzterem Fall geben Sie bitte den genauen Ausdruck an, der entfernt werden soll.
Rinzwind

Antworten:

15

Mit awk

awk '!x[$0]++' infile.txt > outfile.txt

Die Art und Weise, wie es funktioniert, besteht darin, dass die Anzahl der Zeilen in einem Array beibehalten wird. Wenn die aktuelle Anzahl Null ist, dh beim ersten Vorkommen, wird die Zeile gedruckt, andernfalls wird mit der nächsten fortgefahren.

muru
quelle
7

Es gibt mehrere Möglichkeiten, dies zu tun. Wenn die Bestellung nicht wichtig ist, sind Sort und Uniq am einfachsten zu merken. Wenn Sie jedoch die Reihenfolge der Textdatei beibehalten und dennoch Duplikate löschen möchten, ist awk genau das Richtige für Sie. Sie können auch sed verwenden, glaube ich.

Hier ist ein Beispiel

/tmp/debugSys>cat fileWithDupText.txt 
line2
line21
line2
line1
line2
/tmp/debugSys>

/tmp/debugSys>cat fileWithDupText.txt | awk '!a[$0]++' 
line2
line21
line1
/tmp/debugSys>sort fileWithDupText.txt | uniq
line1
line2
line21
/tmp/debugSys>sort -u fileWithDupText.txt 
line1
line2
line21
/tmp/debugSys>
Amit
quelle
2

Habe dafür einen schönen Perl-Einzeiler mit md5-Hashes gefunden ;) , aber das ist langsam und lohnt sich nur, wenn Sie sehr lange Zeilen und eine riesige Datei haben, in der der Speicherbedarf erheblich reduziert wird:

perl -MDigest::MD5 -ne '$seen{Digest::MD5::md5($_)}++ or print' foo

Deshalb einfach benutzen

perl -ne '$seen{$_}++ or print' foo

Quelle


Beispiel

cat foo

foo
fii
foo bar
foobar
foobar
foo

perl -ne '$seen{$_}++ or print' foo

foo
fii
foo bar
foobar
AB
quelle
1
@terdon ja, richtig. Die Idee hat mir gefallen.
AB
1
Und es macht Sinn für sehr lange Zeilen (weshalb ich meinen Kommentar gelöscht habe). Meinetwegen.
Terdon