Remover linhas duplicadas: deduplicar texto online
Cole qualquer lista, retire duplicatas exatas, mantenha a ordem ou ordene o resultado. Inclui alternâncias de maiúsculas e espaços.
O que esta ferramenta faz
Um utilitário gratuito que roda no navegador para remover linhas duplicadas de um único bloco de texto. Cole sua entrada, escolha se quer preservar a ordem original ou ordenar a saída, e as duplicatas somem. Nada sai da sua máquina.
É o equivalente gráfico de sort -u na linha de comando, ou de awk '!seen[$0]++' quando você quer manter a primeira ocorrência na ordem original. Se você já colou uma exportação de e-mails de 4.000 linhas em um terminal só para rodar sort | uniq, isto é a mesma coisa sem o terminal.
A deduplicação é exata e por linha. Duas linhas têm que casar caractere por caractere (sujeito às alternâncias de maiúsculas e recorte) para contar como duplicatas. Correspondência aproximada, detecção de quase duplicatas e pontuação de similaridade ficam de fora de propósito. Outro problema, outra ferramenta.
Como a deduplicação funciona aqui
Internamente a ferramenta percorre cada linha uma vez e rastreia valores vistos em um conjunto baseado em hash, a mesma estrutura de dados do Set do JavaScript ou do set do Python. As consultas são O(1) em média, então um milhão de linhas roda em menos de um segundo num laptop comum. O algoritmo subjacente é a verificação de pertinência em uma hash table.
Dois modos. Preservar ordem mantém a primeira ocorrência de cada linha e descarta toda duplicata posterior, do jeito que awk '!seen[$0]++' se comporta. Ordenar e deduplicar primeiro ordena toda a entrada alfabeticamente e emite cada linha única uma vez, do jeito que sort -u se comporta. Escolha o que seu consumidor de jusante espera.
Há alternâncias para a comparação em si. Sem distinção de maiúsculas trata [email protected] e [email protected] como a mesma linha. Recortar espaços remove espaços e tabs do início e fim antes de comparar, então " example", "example " e "example" se reduzem a uma única entrada. Ambas vêm desligadas por padrão porque o comportamento seguro é casar exatamente o que foi digitado.
Como remover linhas duplicadas em três passos
Um painel de entrada, um de saída. Nada é enviado.
- 1
Cole suas linhas
Solte o texto no painel de entrada. Qualquer lista serve: e-mails, IPs, URLs, SKUs, timestamps de log, nomes de pacotes, qualquer coisa um por linha. Clique em Sample para carregar um exemplo com duplicatas propositais se quiser ver o resultado primeiro.
- 2
Escolha suas opções
Escolha Preservar ordem (mantém a primeira ocorrência, como awk '!seen[$0]++') ou Ordenar e deduplicar (alfabético, como sort -u). Ative Sem distinção de maiúsculas se Alice e alice devem se fundir, e Recortar espaços se espaços do início ou fim devem ser ignorados.
- 3
Copie ou baixe o resultado
O painel direito mostra a saída deduplicada e uma contagem de quantas linhas foram removidas. Clique em Copy para pegar, ou Download para salvar como arquivo .txt. Os dois painéis rolam de forma independente, então você consegue identificar quais linhas sumiram.
Quando você vai querer esta ferramenta
Limpar uma lista de e-mails de marketing antes do import
Exporte sua lista de um CRM, encaixe outra de uma inscrição em webinar, cole as duas na ferramenta, deduplique com Sem distinção de maiúsculas e Recortar espaços ligados. Mailchimp e HubSpot rejeitam endereços duplicados no import de qualquer jeito, mas rejeitam o lote inteiro em vez de só os duplicados, então fazer isso antes economiza um reupload.
Deduplicar IPs em um log de auditoria
Puxe os IPs de origem de uma semana de auth.log com awk, cole, deduplique no modo preservar ordem. Você obtém uma lista limpa de atacantes únicos sem perder o sinal cronológico aproximado de "quem apareceu primeiro". Coloque isso na lista de bloqueio do seu firewall.
Limpar uma lista de URLs raspadas de várias páginas
Raspar um sitemap e um índice paginado vai retornar a mesma URL várias vezes. Solte a lista combinada, ordene e deduplique, e você tem uma fronteira de crawl canônica. Barras finais e query strings ainda contam como linhas distintas, então normalize antes se quiser fundi-las.
Reduzir o ruído do pip freeze ou npm ls a pacotes únicos
pip freeze em dois virtualenvs, ou npm ls --all em um monorepo, imprime o mesmo pacote em muitas linhas. Concatene, cole, deduplique, e você tem uma linha por nome==versão para uma olhada rápida no que está realmente instalado.
Linhas CSV coladas de várias fontes
Funciona para deduplicação no nível da linha, que é o que você normalmente precisa quando cada linha é um registro autocontido. Aviso: isto é deduplicação de texto puro, não consciente de colunas. Se quiser deduplicação real no nível da linha que respeite vírgulas entre aspas e ignore a ordem das colunas, use uma ferramenta CSV de verdade. Para a maioria dos casos colados de planilha, a deduplicação por linha é suficiente.
Limpar uma bibliografia ou lista de citações copiada
Copiar referências de três abas do navegador para um documento te deixa com o mesmo DOI repetido quatro vezes. Cole, ative Recortar espaços (porque copiar e colar de PDFs adora adicionar espaços perdidos), deduplique, e você obtém uma seção de referências limpa. O modo de ordenação é útil aqui para listas alfabéticas.
Referência rápida de deduplicação
Os casos de borda que mais mordem ao deduplicar texto. Vale dar uma passada antes de confiar na saída.
| Topic | What this tool does |
|---|
| Preservação de ordem | Preservar ordem mantém a primeira ocorrência e descarta duplicatas posteriores. Como awk '!seen[$0]++' ou Python list(dict.fromkeys(lines)). O modo ordenar é alfabético, como sort -u. |
|---|
| Sensibilidade a maiúsculas | Desligada por padrão. Alice e alice são distintas a menos que Sem distinção de maiúsculas esteja ligada. Listas de e-mail e nomes de usuário geralmente querem ligada; listas de SKU normalmente não. |
|---|
| Recorte de espaços | Desligado por padrão. " example", "example " e "example" são três linhas diferentes até Recortar espaços ser ligado. Espaços internos nunca são tocados. |
|---|
| Linhas em branco | Tratadas como um valor de linha normal: string vazia. Com a deduplicação ligada, você mantém uma linha em branco se houver alguma na entrada. Para retirar todas as linhas em branco, use um passo separado de limpeza de espaços. |
|---|
| Finais de linha (CRLF vs LF) | Uma linha que termina em \r\n é tecnicamente diferente de uma que termina em \n se o \r final sobreviver à divisão. Dividimos por \r?\n, então finais mistos se fundem. Se você vê duplicatas fantasmas, sua entrada tem caracteres \r perdidos no meio da linha. |
|---|
| Normalização Unicode | Duas strings visualmente idênticas podem comparar como diferentes se uma usa NFC e a outra NFD (acentos pré-compostos vs decompostos). Esta ferramenta não normaliza. Se suspeitar disso, normalize ambas as entradas para NFC primeiro com String.prototype.normalize('NFC') ou unicodedata.normalize do Python. |
|---|
| Quebra de linha no fim | Um arquivo que termina em \n tem uma última linha vazia fantasma. A maioria dos editores esconde isso. Tratamos como uma linha em branco, deduplicada com qualquer outra linha em branco. A saída preserva uma única quebra de linha final por convenção. |
|---|
| Codificação | UTF-8 do começo ao fim. O navegador cuida da decodificação ao colar; se seus bytes eram originalmente Latin-1 ou Windows-1252, caracteres fora do ASCII podem estar errados antes mesmo de a deduplicação rodar. Converta a codificação a montante. |
|---|
Remover linhas duplicadas: perguntas frequentes
Preserva a ordem original ou ordena a saída?
Ambos, sua escolha. Preservar ordem mantém a primeira ocorrência de cada linha e descarta toda duplicata posterior, então a saída fica em mais ou menos a mesma ordem da entrada. Ordenar e deduplicar ordena todo o resultado alfabeticamente. Preservar ordem é o que você quer quando a ordem carrega significado (logs cronológicos, listas com ranking). Ordenar é o que você quer quando precisa só de um conjunto único limpo.
A comparação distingue maiúsculas de minúsculas?
Por padrão sim, porque é a suposição segura. Alice e alice são linhas diferentes a menos que você ligue Sem distinção de maiúsculas. A maioria dos sistemas de e-mail trata endereços como insensíveis a maiúsculas na parte local, então para listas de e-mail você quase sempre vai querer essa alternância ligada. O mesmo vale para nomes de usuário em plataformas insensíveis a maiúsculas. Para SKUs e identificadores genuinamente sensíveis a maiúsculas, deixe desligada.
Pode ignorar espaços do início e do fim?
Sim, com Recortar espaços. Remove espaços e tabs do início e fim antes de comparar, então " example ", "example " e "example" se fundem em uma única entrada. Útil quando sua entrada foi editada à mão ou copiada de um PDF, ambos deixam espaços perdidos. O espaço interno dentro de uma linha não é tocado.
Como isto difere do comando uniq do Unix?
O comando uniq só funde duplicatas adjacentes, o que é uma surpresa comum. Duas linhas idênticas separadas por uma linha diferente sobrevivem ambas ao uniq. Por isso o idioma Unix é sort | uniq ou sort -u: você tem que ordenar primeiro para que duplicatas fiquem lado a lado. Esta ferramenta não precisa de entrada ordenada, porque rastreia cada linha vista em um hash set conforme avança.
Conta quantas duplicatas cada linha tinha?
Não, isso é uma função diferente. Se você precisa de contagens, o comando Unix é uniq -c depois de um sort: sort input.txt | uniq -c | sort -rn dá uma tabela de frequências ordenada por contagem, que é o que você quer ao procurar as entradas mais comuns. Esta ferramenta foca em limpeza, não em análise.
Quão grande é a entrada que posso colar?
Alguns milhões de linhas tudo bem. A deduplicação em si é O(n) com consultas hash em tempo constante, então o gargalo é o navegador renderizando o painel de resultado, não a deduplicação. Para entradas muito grandes (50 MB+), espere uma pausa perceptível quando o textarea se redesenha. Se sua entrada é desse tamanho, você quase certamente já tem sort -u à mão; use-o.
Privacidade e como funciona
Seu texto nunca sai do navegador. A deduplicação roda na sua máquina, localmente, contra um Set do JavaScript. Sem analytics na sua entrada, sem logs, sem viagem à nuvem. A ferramenta toda são poucas linhas de código: dividir por quebras de linha, percorrer, manter o que ainda não vimos. As primitivas da biblioteca padrão por trás disso estão documentadas na referência de Set do MDN e nos docs equivalentes de set do Python.