Remover linhas duplicadas
apple, banana, apple, cherry, banana vira apple, banana, cherry: saem 2 linhas repetidas e ficam 3 únicas, na ordem em que apareceram. Você também pode tratar Apple e apple como a mesma linha. Grátis no seu navegador.
- Grátis
- Funciona no seu navegador
- Sem cadastro
- Seus dados não saem do seu aparelho
Executar grátis
Exemplo resolvido
- Texto
- apple banana apple cherry banana
- Texto
- apple banana cherry
- Texto original
- apple banana apple cherry banana
- Linhas originais
- 5
- Linhas únicas
- 3
Linhas duplicadas aparecem em logs, listas de e-mail, colunas CSV exportadas como texto simples, históricos de shell, trechos de código colados duas vezes e apps de anotações onde o mesmo item foi copiado mais de uma vez. Limpar à mão é lento e sujeito a erros, sobretudo quando diferenças de maiúsculas escondem duplicatas reais ou quando a ordem importa e você precisa manter a primeira aparição em vez da última. Esta ferramenta recebe o texto multilinha que você informa, divide em linhas e devolve uma string deduplicada determinística que preserva a ordem original das primeiras ocorrências. Você pode opcionalmente ignorar maiúsculas e minúsculas para que Apple e apple contem como a mesma linha, mantendo a capitalização da primeira forma que você digitou. Entrada vazia é rejeitada com erro de validação claro em vez de devolver resultado vazio em silêncio, o que protege clientes que esqueceram de vincular um campo.
Como as linhas repetidas saem e a opção de maiúsculas
O motor normaliza estilos de retorno de carro para que CRLF do Windows e CR simples se tornem separadores de nova linha, e então divide a string em cada quebra de linha. Cada linha resultante — inclusive linhas em branco intencionais — é candidata. Na primeira vez que uma linha é vista, ela é mantida com seus caracteres originais; toda linha posterior que coincida com a chave de comparação é descartada.
Por padrão a comparação é exata: espaços, pontuação e maiúsculas importam, de modo que espaços no fim ou Apple versus apple são linhas diferentes. Contagens de linhas removidas e de linhas únicas voltam junto com o texto limpo para painéis e testes assertarem quanto mudou.
Como o caminho é aritmética de parse pura sobre strings — uma única varredura linear com um conjunto hash de chaves vistas —, a latência fica abaixo de um milissegundo em tamanhos típicos de formulário e o modelo de custo publicado é analítico, não baseado em tokens de modelo. Não há correspondência difusa, limiar de distância de edição nem etapa de embeddings semânticos; isso pertence a outras ferramentas, como deduplicação semântica de CSV quando as linhas se parecem mas não são iguais como texto.
Onde remover linhas duplicadas aparece no trabalho real
Desenvolvedores que limpam trechos de log e dumps de histórico de shell precisam de uma lista única de primeira ocorrência antes de colar em tickets ou relatórios de bugs. Equipes de dados que exportam uma única coluna como texto simples costumam querer valores únicos sem abrir uma planilha completa nem escrever um script awk descartável. Editores de conteúdo que consolidam listas de tags, nomes de categoria e entradas de glossário usam o modo sem distinção de maiúsculas para que variantes de grafia colapsem e a primeira capitalização preferida permaneça.
Estudantes e professores preparam listas de vocabulário e conjuntos de linhas de gabarito sem repetições acidentais de copiar e colar. Administradores de sistemas mesclam blocklists e allowlists de várias fontes e precisam de um conjunto único determinístico que não reordene entradas confiáveis anteriores. Se mais tarde você precisar de deduplicação CSV em nível de linha com chaves de coluna, mescla semântica difusa de linhas quase duplicadas ou hash binário de imagens duplicadas, trate isso como intenções de busca e landings separadas em vez de sobrecarregar esta página de remover-linhas-duplicadas.
Casos de uso
Limpar trechos de log e histórico
Cole logs multilinha ou histórico de shell e mantenha a primeira ocorrência de cada linha para tickets e relatórios curtos sem perder a ordem.
Listas únicas de tags e vocabulário
Colapse tags ou linhas de glossário repetidas, opcionalmente ignorando maiúsculas, preservando a primeira grafia preferida.
Perguntas frequentes
Como as linhas duplicadas são detectadas?
O texto é dividido em quebras de linha após normalizar CRLF. A primeira ocorrência é mantida; coincidências posteriores são descartadas.
Linhas em branco são preservadas?
Sim. Uma linha vazia é um valor de linha válido. A primeira linha em branco é mantida; linhas em branco adicionais são tratadas como duplicatas dessa linha vazia.
O que acontece se o texto estiver vazio?
Forneça uma string não vazia; caixas vazias são tratadas como erros de cliente e não são cobradas.
Quanto custa?
A ferramenta do navegador é gratuita e roda localmente.
Qual cópia de uma linha repetida é mantida?
Sempre a primeira. As cópias seguintes são removidas e as linhas que sobram mantêm a ordem em que apareceram pela primeira vez, então os itens do começo de uma lista nunca mudam de lugar.
Ferramentas relacionadas
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/str/dedupe-lines \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"apple\nbanana\napple\ncherry\nbanana"}'const res = await fetch("https://api.kit.forhosting.com/str/dedupe-lines", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "apple\nbanana\napple\ncherry\nbanana"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/str/dedupe-lines",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "apple\nbanana\napple\ncherry\nbanana"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/str/dedupe-lines", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"apple\\nbanana\\napple\\ncherry\\nbanana"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"apple\nbanana\napple\ncherry\nbanana"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/str/dedupe-lines", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"text": "apple\nbanana\napple\ncherry\nbanana"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.dedupe_lines",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |
Notas técnicas
Sem idas e voltas de rede no motor, sem sementes aleatórias e sem dependência de relógio — texto e opções idênticos sempre produzem JSON idêntico que você pode testar com goldens e colocar em cache.
Como a deduplicação de linhas funciona e o que ignore_case significa
Quando ignore_case é true, a chave de associação é a forma em minúsculas Unicode da linha, enquanto a string mantida continua sendo a primeira grafia original que você forneceu — a expectativa usual ao limpar listas de contatos e dumps de tags sem reescrever títulos. Payloads extremamente longos acima do limite de caracteres documentado falham com invalid_input para que uma única requisição não monopolize a memória do Worker.
O que você envia e o que recebe de volta
Envie um campo obrigatório chamado text com a string multilinha não vazia que deseja limpar. Números e booleanos usados como corpo de texto são convertidos para as formas decimal ou true/false; objetos, arrays, NaN e Infinity são rejeitados. Texto vazio falha na validação antes de montar o conjunto e não é cobrado. Aliases como input, value, data, s, message, string, content e body são aceitos por conveniência ao conectar clientes antigos. Opcionalmente envie ignore_case como booleano ou nas formas de string comuns true, false, yes, no, one ou zero. Em sucesso a resposta devolve text como a string deduplicada, original como a string de entrada para eco e depuração, original_lines, unique_lines, removed_lines, o flag ignore_case resolvido e operation com valor dedupe_lines. Verificações clássicas incluem uma lista de frutas com banana e apple repetidas colapsando para três linhas únicas, uma lista com maiúsculas mistas que colapsa mais quando ignore_case é true, e uma única linha única que passa inalterada com removed_lines igual a zero. O preço de chamadas API bem-sucedidas é a base publicada de US$ 0,002 por item; falhas de validação, inclusive texto vazio, não consomem saldo pré-pago.
Onde remover linhas duplicadas aparece no trabalho real
Como esta capacidade é um motor de parse puro, o preço da API é a base publicada de US$ 0,002 por item bem-sucedido e a validação falha não consome saldo.
Casos de integração
Normalizar colunas de exportação como texto
Transforme um dump de texto simples de uma coluna em lista de linhas únicas para fixtures, blocklists e QA sem abrir planilha.
Perguntas técnicas
ignore_case altera a grafia mantida?
Não. Apenas a chave de comparação é colocada em minúsculas. O texto da linha mantido é sempre a primeira grafia original que você forneceu.