Duplikate im Text entfernen
Manchmal hat man Text-Listen, aus denen doppelte Einträge (Duplikate) entfernt werden sollen. Als Quelle soll uns diese Text-Beispiel-Datei dienen. Hier haben sich ein paar Duplikate eingeschlichen! Wenn Ihr das Entfernen selber probieren möchtet, könnt Ihr die Daten als Datei duplikate.txt speichern!
Debian
Manjaro
Ubuntu
Mint
Fedora
Arch
openSUSE
Manjaro
NixOS
Fedora
Arch
Der einfachste Weg um die Daten zu sortieren folgt über die Kommandozeile in einem Terminal-Fenster! Es erfolgt mit zwei Befehlen:Manjaro
Ubuntu
Mint
Fedora
Arch
openSUSE
Manjaro
NixOS
Fedora
Arch
sort duplikate.txt | uniq > neue.txt
cat neue.txt
Arch
Debian
Fedora
Manjaro
Mint
NixOS
openSUSE
Ubuntu
Der Befehl uniq wirkt nur bei aufeinanderfolgenden gleichen Zeilen. Daher muß die Datei zuerst sortiert werden. Wer nur die Duplikate oder die Einzigartigen ausgeben möchte, kommt mit diesen Varianten zum Ziel:cat neue.txt
Arch
Debian
Fedora
Manjaro
Mint
NixOS
openSUSE
Ubuntu
Nur die Einzigartigen: sort duplikate.txt | uniq -u
Nur die Duplikate: sort duplikate.txt | uniq -d
Falls es wichtig ist, die ursprüngliche Reihenfolge beizubehalten, darf man keine Sortierung anwenden. Dann empfiehlt sich dieser unverständliche awk-Befehl:Nur die Duplikate: sort duplikate.txt | uniq -d
awk '!v[$0]++' duplikate.txt > neue.txt
cat neue.txt
Debian
Manjaro
Ubuntu
Mint
Fedora
Arch
openSUSE
NixOS
Falls jemand wirklich wissen möchte, was awk hier veranstaltet, bitte schön:cat neue.txt
Debian
Manjaro
Ubuntu
Mint
Fedora
Arch
openSUSE
NixOS
Dieser Befehl verwendet ein Wörterbuch (auch bekannt als Map, assoziatives Array) v, um jede Zeile und die Anzahl ihrer bisherigen Vorkommen in der Datei zu speichern.
!v[$0]++ wird für jede Zeile der Datei ausgeführt.
$0 enthält den Wert der aktuellen Zeile, die verarbeitet wird.
v[$0] prüft, wie oft die aktuelle Zeile bisher vorgekommen ist.
!v[$0] gibt true zurück, wenn v[$0] == 0 ist, oder wenn die aktuelle Zeile kein Duplikat ist. In diesem Fall wird die Zeile gedruckt (die Anweisung print wird der Einfachheit halber weggelassen).
v[$0]++ erhöht die Frequenz der aktuellen Zeile um eins.
!v[$0]++ wird für jede Zeile der Datei ausgeführt.
$0 enthält den Wert der aktuellen Zeile, die verarbeitet wird.
v[$0] prüft, wie oft die aktuelle Zeile bisher vorgekommen ist.
!v[$0] gibt true zurück, wenn v[$0] == 0 ist, oder wenn die aktuelle Zeile kein Duplikat ist. In diesem Fall wird die Zeile gedruckt (die Anweisung print wird der Einfachheit halber weggelassen).
v[$0]++ erhöht die Frequenz der aktuellen Zeile um eins.