Remover linhas duplicadas

Mantém a primeira ocorrência de cada linha; opção de comparar após trim.

Descrição

Duplicatas em texto podem parecer um problema menor, mas qualquer pessoa que já precisou limpar uma lista de e-mails, consolidar imports de TypeScript ou processar logs de servidor sabe o quanto elas atrasam. A lógica por trás da remoção de duplicatas é elegante: cria-se um conjunto (Set) que registra quais linhas já foram vistas; ao encontrar uma linha nova, ela vai para a saída; ao encontrar uma repetição, ela é silenciosamente descartada.

A escolha de manter a primeira ocorrência e não a última é deliberada. Na maioria dos casos de uso, a ordem original do documento tem significado: a primeira importação de uma dependência geralmente define o escopo, a primeira ocorrência de um endereço em uma lista consolidada costuma ser a mais confiável. Inverter a lógica e manter a última ocorrência é trivial, mas exige intenção consciente.

O detalhe que muda tudo é a estratégia de comparação: duas linhas com o mesmo conteúdo mas capitalização diferente são duplicatas? admin e Admin referem-se à mesma coisa em um arquivo de configuração? E a versão com espaços nas bordas? Para isso existem as opções de comparação case-insensitive e de trim antes de comparar. A linha exibida na saída é sempre a versão original da primeira ocorrência — a normalização acontece apenas durante a comparação, sem alterar o conteúdo.

Em bases de dados, o equivalente é o SELECT DISTINCT ou o GROUP BY. Em linguagens funcionais, é o nub de Haskell. Em Python, é o famoso dict.fromkeys(). Todos resolvem o mesmo problema com a mesma ideia central: um hash do valor como chave de um dicionário visitado.

Detalhamento técnico

Casos de uso comuns

  • Listas de dependências: arquivos requirements.txt, package.json ou pom.xml que cresceram ao longo do tempo frequentemente acumulam entradas duplicadas vindas de merges e copias manuais.
  • Imports e diretivas de código: consolidar arquivos de TypeScript, Python ou C# de várias origens costuma produzir imports repetidos que o compilador aceita mas que poluem o código.
  • Endereços e cadastros: listas de e-mail, telefones ou CPFs exportadas de sistemas diferentes chegam cheias de entradas duplicadas com variações sutis de capitalização.
  • Logs de servidor: ao concatenar logs de múltiplos períodos para análise, linhas idênticas de aviso ou erro se repetem centenas de vezes e obscurecem os eventos únicos.
  • Arquivos de configuração: opções de configuração duplicadas podem causar comportamentos inesperados dependendo de qual ocorrência o parser usa.

Modos de comparação

  • Comparação exata (padrão): duas linhas são duplicatas somente se forem byte a byte idênticas. A linha de saída preserva a capitalização e os espaços originais.
  • Case-insensitive: converte ambas as linhas para minúsculas antes de comparar. Útil para listas de nomes, endereços e identificadores que podem vir com capitalização inconsistente.
  • Trim antes de comparar: remove espaços e tabs das bordas antes de verificar se a linha já foi vista. A linha de saída ainda exibe o conteúdo original com os espaços, mas o critério de duplicata ignora o recuo.
  • Combinação de case-insensitive e trim: o modo mais permissivo, que trata variantes com espaços extras e capitalização diferente como a mesma linha.

Guia da ferramenta

  • O que é o objeto tratado Texto multilinha (listas, logs, exports), onde cada linha é uma unidade.

  • O que a ferramenta faz Mantém só a primeira ocorrência de cada linha (com opção de ignorar espaços nas pontas na comparação).

  • Por que usar Limpar listas de e-mails, IDs ou URLs copiados de várias fontes, preparar dados únicos para importação.

Exemplo de Código

Deduplicação com Set em JavaScript
function dedupeLines(text, { caseSensitive = true, trim = false } = {}) {
  const seen = new Set();
  return text
    .split('\n')
    .filter(line => {
      let key = trim ? line.trim() : line;
      if (!caseSensitive) key = key.toLowerCase();
      if (seen.has(key)) return false;
      seen.add(key);
      return true;
    })
    .join('\n');
}
Equivalente em Python
def dedupe_lines(text, case_sensitive=True, trim=False):
    seen = set()
    result = []
    for line in text.splitlines():
        key = line.strip() if trim else line
        if not case_sensitive:
            key = key.lower()
        if key not in seen:
            seen.add(key)
            result.append(line)
    return '\n'.join(result)

Antes

a
b
a
b
c → a
b
c

Perguntas frequentes

Para que serve esta ferramenta?

Ela roda 100% no seu navegador: útil para validar, formatar ou converter dados no dia a dia de desenvolvimento.

Meus dados são enviados a algum servidor?

O processamento é feito localmente via JavaScript. Não armazenamos o conteúdo que você cola nas caixas de texto.

Posso usar em produção ou para dados reais?

Use por sua conta e risco. Para segredos (senhas, tokens), prefira ambientes controlados e políticas da sua empresa. E lembre sempre de revisar os conteúdos gerados. Nunca confie cegamente nas coisas que vê na internet.