Zum Inhalt springen
OneKitly

Duplikate in einer Liste finden — ohne Tabellenkalkulation

Veröffentlicht am 7.8.2026 · 10 Min. Lesezeit · Text- & Sprach-Tools

Daniel Okonkwo

Daniel OkonkwoFront-end-Entwickler und Tech-Redakteur bei OneKitly

Web-Performance · Dateiformate

Anhand von 4 Quellen geprüft

Profil ansehen
Kurz gesagt

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.

Paare optisch identischer Zeilen, durch den Duplikatfinder geschickt, mit dem, was er tatsächlich meldete
EingabeWas er meldeteWarum
Paris, paris, PARIS — VoreinstellungenKeine 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 VorkommensBeide Seiten werden zum Vergleich kleingeschrieben, für die Anzeige bleibt der Originaltext
Paris, dann Paris gefolgt von einem LeerzeichenKeine Duplikate, in beiden ModiDas Werkzeug trimmt nie und hat keine Trimm-Option
Dieselben zwei Zeilen in remove-duplicate-linesEine Zeile kommt herausDieses Werkzeug hat einen Schalter „Zeilen trimmen“, voreingestellt an
New York mit gewöhnlichem Leerzeichen, dann New York mit U+00A0Keine DuplikateVerschiedene Codepunkte; verglichen werden die exakten Zeichen
Das Wort café zweimal, in den zwei Unicode-Formen geschriebenKeine DuplikateEs wird nicht normalisiert; eine Zeile hat vier Codepunkte, die andere fünf
Dasselbe, plus eine dritte Kopie in der ersten Formcafé — ein Duplikat wird gemeldetZwei der drei stimmen nun exakt überein, die Zählung erreicht also zwei
Eine Liste, deren einziger wiederholter Wert die Leerzeile istKeine DuplikateDie Ausgabe wäre die leere Zeichenkette, und eine leere Ausgabe löst dieselbe Meldung aus
Doppelte Zeilen findenZeige nur die Zeilen, die mehr als einmal vorkommen.Tool ausprobieren

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
RatgeberEine aus Tabelle oder PDF eingefügte Liste bereinigenEin Einfügen bringt unsichtbare Zeichen mit: geschützte Leerzeichen, weiche Trennstriche, Nullbreiten-Leerzeichen, Tabs und CRLF. Vier Bereinigungswerkzeuge liefen über jedes davon — und sie verwenden drei verschiedene Definitionen von Leerraum.AnleitungZeilen nummerieren, damit mehrere Leute denselben Text prüfen könnenDie Nummerierung beginnt bei 1 und lässt sich nicht auf 0 setzen, ausgerichtet wird mit Leerzeichen statt Nullen, und das Entfernen macht acht der elf Trennzeichen rückgängig, ohne die Einrückung anzutasten. Was es weiterhin nicht kann: deine Zahlen von seinen unterscheiden.AnleitungUnsauberen Text bereinigen: die Reihenfolge der Schritte, auf die es ankommtTags entfernen, bevor Entitäten dekodiert werden, trimmen vor dem Deduplizieren, Leerraum zuletzt zusammenfassen. Drei Reihenfolgen in Node ausgeführt, eine neunstufige Pipeline in der richtigen Abfolge und die unsichtbaren Zeichen — U+00A0, U+200B, U+FEFF — die jede naive Bereinigung überleben.ErklärungText sortieren ist nicht eine Operation: vier Reihenfolgen, die sich alle alphabetisch nennenCodeeinheiten-Ordnung, natürliche Ordnung und Locale-Kollation an derselben Liste in Node ausgeführt, Ausgaben abgedruckt. Warum Zebra vor apple steht, warum item10 vor item9 steht und warum ä im Deutschen neben a liegt, im Schwedischen aber hinter z.RatgeberZwischen Listenformaten konvertieren, ohne Daten zu verlieren: die Anführungsregeln, die niemand liestAus einer Liste mit Zeilenumbrüchen eine Kommaliste zu machen ist trivial, bis ein Eintrag ein Komma enthält. Die Anführungsregeln von RFC 4180, warum ein CSV-Feld einen Zeilenumbruch enthalten darf, warum europäische Tabellenkalkulationen das Semikolon verwenden und was ein leerer Eintrag mit dem Hin- und Rückweg macht — jeder Fall ausgeführt und abgedruckt.AnleitungZeilen nach einem Muster filtern — ohne KommandozeileDas ist grep für Menschen, die grep nicht benutzen — mit einem wichtigen Unterschied: Gesucht wird eine reine Teilzeichenkette, ein echter regulärer Ausdruck liefert also ein leeres Feld und keine Fehlermeldung. Jede Aussage hier wurde durch Ausführen des Werkzeugs geprüft.

Ä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?

Duplikate in einer Liste finden — ohne Tabellenkalkulation — OneKitly