Duplikate in einer Liste finden — ohne Tabellenkalkulation
Veröffentlicht am 7.8.2026 · 10 Min. Lesezeit · Text- & Sprach-Tools
Daniel Okonkwo — Front-end-Entwickler und Tech-Redakteur bei OneKitly
Web-Performance · Dateiformate
Anhand von 4 Quellen geprüft
duplicate-line-finder vergleicht ganze Zeilen, Byte für Byte. Standardmäßig unterscheidet der Vergleich Groß- und Kleinschreibung: Paris, paris und PARIS zusammen durchgeschickt ergaben gar keine Duplikate; mit eingeschaltetem „Groß/Klein ignorieren“ meldet er eines, ausgegeben als Paris, die Schreibweise des ersten Vorkommens. Er trimmt nicht: Paris über Paris-mit-nachfolgendem-Leerzeichen kam in beiden Modi als „keine Duplikate“ zurück. Das ist die häufigste Überraschung, und es lohnt sich zu wissen, dass das Schwesterwerkzeug remove-duplicate-lines standardmäßig trimmt und bei genau dieser zweizeiligen Eingabe eine der beiden löscht. Keines von beiden liegt falsch; sie beantworten schlicht verschiedene Fragen und stehen nebeneinander im Angebot. Er normalisiert auch nicht nach Unicode: Ein Wort, dessen Akzent ein einziger Codepunkt ist, und dasselbe Wort, dessen Akzent ein Buchstabe plus kombinierendes Zeichen ist, sind zwei verschiedene Zeilen, obwohl sie identisch aussehen — was besonders französische, spanische und portugiesische Listen trifft. Die Ausgabe ist keine bereinigte Liste. Sie ist die Menge der Werte, die mehr als einmal vorkommen, je einmal gedruckt, in der Reihenfolge ihres ersten Auftretens und im exakten Wortlaut dieses ersten Auftretens. Wiederholt sich nichts, bekommst du eine kurze Meldung statt eines leeren Felds. Leerzeilen zählen wie jede andere Zeile, mit einer Eigenheit: Ist der einzige wiederholte Wert deiner Liste die Leerzeile, meldet das Werkzeug keine Duplikate, denn seine Ausgabe wäre die leere Zeichenkette, und die löst dieselbe Meldung aus.
Zwei Zeilen, die identisch aussehen, sind es oft nicht. Groß- und Kleinschreibung, ein Leerzeichen am Ende, ein geschütztes Leerzeichen und zwei verschiedene Kodierungen desselben Akzentbuchstabens liefen je durch den Duplikatfinder — in drei von vier Fällen meldete er keine Duplikate.
Was das Werkzeug tatsächlich zurückgibt
Es zählt jede Zeile, behält die mit einer Zählung größer als eins und druckt jede davon einmal. Bei der Eingabe b, a, b, a, c gab es b und dann a zurück — in dieser Reihenfolge, weil b zuerst auftaucht, nicht weil b öfter wiederkehrt. Nichts wird sortiert, nichts aus deiner Liste entfernt, und wie oft sich ein Wert wiederholt, steht nirgends. Willst du die Liste ohne die Wiederholungen, ist das ein anderes Werkzeug, remove-duplicate-lines, und es behält das erste Vorkommen jedes Werts an seiner ursprünglichen Stelle.
Der gedruckte Text ist das erste Vorkommen, wörtlich. Das klingt nach einer Kleinigkeit, bis du „Groß/Klein ignorieren“ einschaltest: Bei Apple, banana, APPLE druckt es Apple, weder APPLE noch apple. Es hat entschieden, dass beide derselbe Wert sind, muss dir einen zeigen, und zeigt den zuerst angetroffenen. Mischt deine Liste geschriene und normale Schreibweisen, sagt dir die Ausgabe also, welche Schreibweise zuerst kam — nicht, welche häufiger oder welche richtig ist.
Das Leerzeichen am Ende und das Schwesterwerkzeug, das widerspricht
Paris über Paris-mit-einem-Leerzeichen-am-Ende ergab keine Duplikate, und Paris über Leerzeichen-Paris ebenso wenig. Die zwei Zeilen unterscheiden sich um ein Zeichen, dieses Zeichen ist unsichtbar, und das Werkzeug hat keinen Trimm-Schalter, den man einschalten könnte. Derweil trägt remove-duplicate-lines einen Schalter „Zeilen trimmen“, der ab Werk an ist: Dieselben zwei Zeilen gehen hinein, eine kommt heraus. Zwei Werkzeuge derselben Kategorie, eine Seite voneinander entfernt, mit gegenteiligen Antworten auf dieselbe Eingabe. Beide sind vertretbar: Ein Duplikatfinder, der trimmt, würde über den Inhalt deiner Datei lügen, und ein Duplikatentferner, der nicht trimmt, ließe dir eine Liste, die weiterhin doppelt aussieht.
Die praktische Folge ist eine Reihenfolge. Lass zuerst trim-lines über die Liste laufen, dann den Finder. Bei einer absichtlich unordentlichen Eingabe — zwei Leerzeichen, alpha, zwei Leerzeichen, dann eine reine Tab-Zeile, dann zwei Leerzeichen, beta, ein Leerzeichen, dann eine leere Zeile, dann alpha — meldete der Finder auf dem Rohtext keine Duplikate und auf demselben Text nach trim-lines und remove-blank-lines das Wort alpha. An der Liste änderte sich nichts, was eine lesende Person bemerkt hätte. Geändert hat sich, ob das Werkzeug sehen konnte, was der Mensch sah.
Zwei Schreibweisen desselben Akzentworts
Unicode kann einen Akzentbuchstaben auf zwei Arten schreiben. Entweder als einen Codepunkt, der den Akzent schon trägt, oder als nackten Buchstaben gefolgt von einem eigenen kombinierenden Zeichen. Beide erscheinen als dieselbe Glyphe, beide sind korrekt, und welche du bekommst, hängt von der Herkunft des Textes ab — manche Betriebssysteme und manche Eingabewege erzeugen standardmäßig die zerlegte Form. Unicode Standard Annex Nr. 15 definiert die Normalisierungsformen, die eine auf die andere abbilden, und JavaScript stellt sie über eine String-Methode bereit. duplicate-line-finder ruft sie nicht auf.
Eine Liste mit dem Wort für Kaffee, je einmal in jeder Schreibweise, kam also als „keine Duplikate“ zurück. Die zwei Zeilen sind optisch nicht zu unterscheiden und vier gegenüber fünf Codepunkte lang. Dann die Eigenheit: Füge eine dritte Kopie in der ersten Schreibweise hinzu, und das Werkzeug meldet plötzlich ein Duplikat, weil nun zwei der drei exakt übereinstimmen. Das ist die Fehlerform, auf die zu achten ist. Es ist nicht so, dass das Werkzeug akzentuierte Duplikate nie fände; es findet manche, was das Übersehene weit schwerer bemerkbar macht. Ist deine Liste französisch, spanisch, portugiesisch, deutsch oder italienisch und wirken die Zahlen etwas niedrig, teste das zuerst — und zwar, indem du die Liste vorher sortierst: Die zwei Schreibweisen landen nebeneinander und verraten sich, indem sie sich weigern, verschieden auszusehen.
„Groß/Klein ignorieren“ ist nicht dasselbe wie die Sprache falten
Der Schalter setzt beide Seiten mit der sprachunabhängigen Abbildung von JavaScript in Kleinbuchstaben. Das deckt die gewöhnlichen Fälle in allen sechs Sprachen ab und behandelt akzentuierte Buchstaben korrekt: Groß- und Kleinform eines akzentuierten Vokals fallen zusammen. Darüber hinaus tut es nichts, was eine bestimmte Sprache wollen würde. Die als zwei Buchstaben geschriebene Großform und das scharfe s fallen nicht zusammen — geprüft: Eine zweizeilige Liste mit der Groß- und der Kleinschreibung eines geläufigen deutschen Straßenworts kam als „keine Duplikate“ zurück, weil das Kleinschreiben der geschrienen Form zwei Buchstaben ergibt, wo die andere Zeile einen hat.
Der allgemeine Punkt: „Groß/Klein ignorieren“ beantwortet eine typografische Frage, keine sprachliche. Zwei Zeilen, die eine französisch lesende Person denselben Eintrag nennen würde — eine mit getipptem Akzent, eine ohne —, sind hier keine Duplikate und werden es nie sein, denn Akzente zu entfernen ist eine andere Operation mit einem anderen Werkzeug. Brauchst du diesen Vergleich, entferne zuerst die Akzente aus einer Kopie der Liste, lass den Finder auf der Kopie laufen und nimm seine Ausgabe als Liste von Punkten, die im Original zu prüfen sind.
Ein brauchbarer Ablauf
Säubern, dann finden, dann entscheiden, dann entfernen. trim-lines und remove-blank-lines bringen jede Zeile in eine vergleichbare Form. duplicate-line-finder sagt dir, welche Werte sich wiederholen, ohne etwas anzurühren. Du siehst dir diese kurze Liste an und entscheidest, ob jede Wiederholung eine echte Doppelerfassung ist oder zwei verschiedene Dinge, die zufällig einen Namen teilen — das kann das Werkzeug nicht wissen, und genau diesen Schritt überspringen die meisten. Erst danach geht remove-duplicate-lines über das Original. In dieser Reihenfolge löschst du nie eine Zeile, die du nicht angesehen hast, und das zählt, wenn die Liste aus Kundenreferenzen besteht statt aus Testdaten.
Ein letztes Detail aus den Läufen. Beide Werkzeuge trennen an einem Zeilenvorschub mit optionalem Wagenrücklauf davor, eine unter Windows gespeicherte Liste und dieselbe auf einem Mac gespeicherte liefern also identische Ergebnisse — eine CRLF-Datei mit zwei Kopien des Buchstabens a meldete ein Duplikat, genau wie die einfache Fassung. Und ein abschließender Zeilenumbruch am Ende deiner Liste erzeugt eine letzte leere Zeile, die zwar gezählt, für sich allein aber nie gedruckt wird.
| Eingabe | Was er meldete | Warum |
|---|---|---|
| Paris, paris, PARIS — Voreinstellungen | Keine Duplikate | „Groß/Klein ignorieren“ ist voreingestellt aus; die drei Zeilen unterscheiden sich |
| Dieselben drei Zeilen mit „Groß/Klein ignorieren“ | Paris — mit der Schreibweise des ersten Vorkommens | Beide Seiten werden zum Vergleich kleingeschrieben, für die Anzeige bleibt der Originaltext |
| Paris, dann Paris gefolgt von einem Leerzeichen | Keine Duplikate, in beiden Modi | Das Werkzeug trimmt nie und hat keine Trimm-Option |
| Dieselben zwei Zeilen in remove-duplicate-lines | Eine Zeile kommt heraus | Dieses Werkzeug hat einen Schalter „Zeilen trimmen“, voreingestellt an |
| New York mit gewöhnlichem Leerzeichen, dann New York mit U+00A0 | Keine Duplikate | Verschiedene Codepunkte; verglichen werden die exakten Zeichen |
| Das Wort café zweimal, in den zwei Unicode-Formen geschrieben | Keine Duplikate | Es wird nicht normalisiert; eine Zeile hat vier Codepunkte, die andere fünf |
| Dasselbe, plus eine dritte Kopie in der ersten Form | café — ein Duplikat wird gemeldet | Zwei der drei stimmen nun exakt überein, die Zählung erreicht also zwei |
| Eine Liste, deren einziger wiederholter Wert die Leerzeile ist | Keine Duplikate | Die Ausgabe wäre die leere Zeichenkette, und eine leere Ausgabe löst dieselbe Meldung aus |
Häufige Fragen
- Der Finder meldet keine Duplikate, aber ich sehe zwei identische Zeilen. Was ist los?
- Drei Kandidaten, nach Wahrscheinlichkeit. Ein Leerzeichen am Anfang oder Ende einer der beiden, das das Werkzeug nicht trimmt. Ein geschütztes statt eines gewöhnlichen Leerzeichens irgendwo im Inneren, was in aus Dokumenten eingefügtem Text ständig vorkommt. Oder zwei verschiedene Unicode-Schreibweisen desselben Akzentbuchstabens. Prüfe in dieser Reihenfolge: Lass trim-lines über die Liste laufen und versuche es erneut — das klärt den ersten Kandidaten in Sekunden. Findet er weiterhin nichts und enthalten die Zeilen Akzente, ist es der dritte Kandidat, und ein Sortieren stellt die zwei Schreibweisen nebeneinander, sodass du sie vergleichen kannst.
- Warum gibt es sowohl einen Duplikatfinder als auch einen Duplikatentferner?
- Weil beide verschiedene Fragen beantworten und verschiedene Voreinstellungen haben. Der Finder meldet, was sich wiederholt, und ändert nichts, damit du schauen kannst, bevor du schneidest; er trimmt nicht, was ihn zu einem getreuen Bericht darüber macht, was buchstäblich in der Datei steht. Der Entferner liefert eine bereinigte Liste und trimmt standardmäßig, was ihn nachsichtig gegenüber dem unsichtbaren Müll macht, den ein Einfügen mitbringt. Bei zwei Zeilen, die sich nur um ein Leerzeichen am Ende unterscheiden, meldet der Finder nichts und der Entferner löscht eine. Das ist bei keinem ein Fehler; es ist der Grund, den Finder zuerst laufen zu lassen, wenn die Liste zählt.
- Sagt es mir, wie oft sich jeder Wert wiederholt?
- Nein. Es zählt intern, nutzt die Zählung, um zu entscheiden, ob ein Wert des Druckens wert ist, und druckt dann nur den Wert. Bei b, a, b, a, c gab es b und a ohne jede Zahl zurück, und es gibt keine Option, sie anzuzeigen. Brauchst du die Zahlen, sortiere die Liste und lies die Blöcke, oder setze einen Wort- beziehungsweise Vorkommenszähler auf die Werte an, von denen du schon weißt, dass sie sich wiederholen. Die Aufgabe des Finders ist eine kurze Verdächtigenliste, und daran hält er sich bewusst.
- Behandelt es eine E-Mail-Adresse in zwei Schreibweisen als eine Adresse?
- Nur wenn du „Groß/Klein ignorieren“ einschaltest, und das solltest du: Die Domain-Hälfte einer Adresse ist laut Spezifikation unabhängig von der Schreibweise, dieselbe Mailbox in zwei Schreibweisen ist also wirklich eine Adresse. Mit ausgeschaltetem Schalter meldet das Werkzeug bei einer zweizeiligen Liste mit gemischter und kleiner Schreibweise derselben Adresse nichts — direkt geprüft. Das lohnt sich vor dem Entdoppeln eines Kontaktexports, denn eine Liste, die bei 1 200 Zeilen sauber aussieht, kann zwei Dutzend davon enthalten, und jede ist ein Mensch, der den Versand zweimal bekommt.
- Kann ich das auf einer Liste mit Tausenden Zeilen einsetzen?
- Ja. Die Arbeit besteht aus einem Durchlauf zum Zählen und einem zum Einsammeln, mit einer Hash-Map, deren Schlüssel die Zeile ist; die Zeit wächst also ungefähr im Takt der Zeilenzahl statt mit ihrem Quadrat — ein naiver Vergleich jeder Zeile mit jeder anderen überstünde ein paar tausend Zeilen nicht, und darum geht es hier nicht. Alles läuft in der Seite, auf deinem Rechner, ohne Upload, die praktische Grenze ist also der Speicher deines Browsers und keine Serverbeschränkung. Was dich bremst, ist nicht das Werkzeug, sondern das Lesen der Ausgabe und die Entscheidung, was jede Wiederholung bedeutet.
Artikel, die dich interessieren könnten
Alle Ratgeber →Ähnliche Tools
Alles hier beschreibt, was diese Werkzeuge heute tun — geprüft, indem ihre eigenen Transformationen mit genau den in jedem Artikel abgedruckten Eingaben ausgeführt wurden — und nicht, was ein Standard einem Textwerkzeug vorschreibt. Zeilenweise Textverarbeitung hat keine einzige Instanz: Was als Leerraum zählt, ob zwei akzentuierte Zeilen dieselbe Zeile sind und wo eine URL im Fließtext endet, entscheidet jedes Programm anders, in das du je etwas einfügen wirst. Wo ein Werkzeug einen Fall falsch behandelt, wird das offen gesagt statt umgangen. Bevor du irgendetwas davon über eine Liste laufen lässt, die du nicht neu exportieren kannst, lauf über eine Kopie und vergleiche die Zeilenzahl an beiden Enden.
Quellen
Hast du einen Fehler in diesem Artikel entdeckt?