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 line
Sekunden.
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 line
Sekunden.
Antworten:
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.
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>
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
Beispiel
cat foo
foo
fii
foo bar
foobar
foobar
foo
perl -ne '$seen{$_}++ or print' foo
foo
fii
foo bar
foobar