Ich habe die sed
Antwort nicht lange nach dem Posten dieser Frage gefunden. sed
Bisher hat noch niemand davon Gebrauch gemacht. Hier ist es:
sed '$!N;/^\(.*\)\n\1$/d;P;D'
Ein bisschen Herumspielen mit dem allgemeineren Problem (wie wäre es mit dem Löschen von Zeilen in Dreier- oder Vier- oder Fünfersätzen?) Ergab die folgende erweiterbare Lösung:
sed -e ':top' -e '$!{/\n/!{N;b top' -e '};};/^\(.*\)\n\1$/d;P;D' temp
Erweitert, um Dreifache von Zeilen zu entfernen:
sed -e ':top' -e '$!{/\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1$/d;P;D' temp
Oder um Quads von Zeilen zu entfernen:
sed -e ':top' -e '$!{/\n.*\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1\n\1$/d;P;D' temp
sed
hat einen zusätzlichen Vorteil gegenüber den meisten anderen Optionen, nämlich die Fähigkeit, wirklich in einem Stream zu arbeiten, wobei nicht mehr Speicher benötigt wird als die tatsächliche Anzahl der auf Duplikate zu überprüfenden Zeilen.
Wie in den Kommentaren erwähnt , ist das Setzen des Gebietsschemas auf C erforderlich, um zu vermeiden, dass Zeilen, die Mehrbytezeichen enthalten, nicht ordnungsgemäß entfernt werden. So werden die obigen Befehle:
LC_ALL=C sed '$!N;/^\(.*\)\n\1$/d;P;D' temp
LC_ALL=C sed -e ':top' -e '$!{/\n/!{N;b top' -e '};};/^\(.*\)\n\1$/d;P;D' temp
LC_ALL=C sed -e ':top' -e '$!{/\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1$/d;P;D' temp
# Etc.
C
ungültiges Zeichen in diesem Gebietsschema festlegen , andernfalls schlägt der Befehl fehl.