Resumo: linhas "duplicadas" nem sempre são bytes idênticos — espaços finais, maiúsculas diferentes ou normalização Unicode diferente podem esconder duplicatas exatas ou criar falsas. Entender como a comparação funciona torna sua limpeza precisa em vez de apagar acidentalmente linhas que você precisava. Combine este guia com Remove Duplicate Lines, Text Difference, Word Frequency e Remove Extra Spaces.

Duplicate Finder no CharCount remove linhas repetidas de listas, logs, exportações CSV e listas de palavras-chave. A parte complicada não é a remoção — é decidir o que conta como "a mesma linha" antes de remover qualquer coisa.

Referências: a referência do MDN sobre JavaScript Set explica a estrutura de dados que a maioria das ferramentas de deduplicação usa internamente, o guia do MDN sobre String.normalize() cobre a normalização Unicode, e o relatório Unicode sobre segmentação de texto (UAX #29) define como o texto é dividido em unidades com significado.

Como encontrar e remover linhas duplicadas em texto, rápido

Como a detecção de duplicatas realmente funciona

Por baixo dos panos, uma ferramenta de linhas duplicadas percorre cada linha e verifica se ela já foi vista — normalmente usando um Set, que armazena valores únicos e rejeita duplicatas exatas em tempo constante. Isso é rápido, mas "exato" faz muito trabalho nessa frase: um Set compara strings byte a byte, então "Maçã" e "maçã" são entradas diferentes, assim como "texto " e "texto" (espaço final).

É por isso que uma deduplicação ingênua em uma exportação CSV ou lista de palavras-chave raspada muitas vezes "falha" — ela não está quebrada, está comparando exatamente o que você forneceu, incluindo espaços invisíveis e diferenças de maiúsculas que você não notou.

Preservar a ordem vs. ordenar e depois deduplicar

Há duas estratégias comuns. A deduplicação que preserva a ordem mantém a primeira ocorrência de cada linha e sua posição original — a escolha certa para logs, exportações de chat ou qualquer coisa onde a sequência importa. Ordenar e depois deduplicar (como o clássico pipeline Unix sort | uniq) reordena tudo alfabeticamente primeiro, o que é mais rápido em arquivos enormes mas destrói a ordem original — bom para uma lista de palavras-chave, ruim para um changelog.

Escolha preservar a ordem sempre que "o que veio primeiro" importar; escolha ordenar-e-deduplicar apenas quando a ordem da lista era arbitrária desde o início.

Onde a normalização muda a contagem

O Unicode permite que o mesmo caractere visível exista como sequências de bytes diferentes — um "é" acentuado pode ser um único ponto de código composto (NFC) ou um "e" mais um sinal diacrítico combinante separado (NFD). Duas linhas que parecem idênticas na tela podem falhar em uma deduplicação de correspondência exata se uma vier de uma exportação Mac e a outra de Windows, porque estão em formas de normalização diferentes.

String.normalize('NFC') reduz ambas as formas à mesma representação antes de comparar — por isso uma boa ferramenta de duplicatas normaliza o texto primeiro, senão subconta silenciosamente duplicatas que são visualmente idênticas, mas não byte a byte.

Um fluxo de limpeza mais seguro

  • Decida primeiro: a ordem das linhas importa para esta lista? Isso determina sua estratégia.
  • Remova espaços finais e normalize maiúsculas apenas se a lista deve ser insensível a maiúsculas (uma lista de palavras-chave costuma ser; uma lista de senhas nunca).
  • Execute a deduplicação e depois verifique uma amostra das linhas removidas para confirmar que eram realmente duplicatas.
  • Mantenha o arquivo original até verificar a versão limpa.

Para qualquer caso ambíguo, passe o antes/depois por Text Difference para ver exatamente o que foi removido, e Word Frequency para checar que nenhum termo repetido legítimo foi tratado como ruído.