Quitar líneas duplicadas

Mantiene la primera aparición de cada línea; opción de trim antes de comparar.

Descripción

Los duplicados en texto pueden parecer un problema menor, pero cualquiera que haya limpiado una lista de correos electrónicos, consolidado imports de TypeScript o procesado logs de servidor sabe cuánto ralentizan el trabajo. La lógica detrás de la eliminación de líneas duplicadas es elegante: se crea un Set que registra qué líneas ya se han visto; cuando aparece una línea nueva, va a la salida; cuando se encuentra una repetición, se descarta silenciosamente.

Mantener la primera aparición en lugar de la última es una decisión deliberada. En la mayoría de los casos de uso, el orden original del documento tiene significado: el primer import de una dependencia generalmente define el ámbito, la primera aparición de una dirección en una lista consolidada suele ser la más fiable. Invertir la lógica para mantener la última aparición es trivial, pero requiere una intención consciente.

El detalle que lo cambia todo es la estrategia de comparación: ¿son duplicados dos líneas con el mismo contenido pero distinta capitalización? ¿Son lo mismo admin y Admin en un archivo de configuración? ¿Y la versión con espacios alrededor? Por eso existen las opciones de comparación sin distinción entre mayúsculas y minúsculas y de trim antes de comparar. La línea escrita en la salida es siempre la versión original de la primera aparición: la normalización ocurre solo durante la comparación y no altera el contenido.

En bases de datos, el equivalente es SELECT DISTINCT o GROUP BY. En lenguajes funcionales, es el nub de Haskell. En Python, es el clásico dict.fromkeys(). Todos resuelven el mismo problema con la misma idea central: un hash del valor como clave en un diccionario visitado.

Detalle técnico

Casos de uso comunes

  • Listas de dependencias: los archivos requirements.txt, package.json o pom.xml que crecieron con el tiempo acumulan con frecuencia entradas duplicadas procedentes de fusiones y copias manuales.
  • Imports y directivas de código: consolidar archivos de TypeScript, Python o C# de múltiples orígenes suele generar imports repetidos que compilan bien pero ensucian el código.
  • Listas de direcciones y contactos: listas de correo electrónico, teléfonos o identificadores exportadas de distintos sistemas llegan llenas de duplicados con variaciones sutiles de capitalización.
  • Logs de servidor: al concatenar registros de varios períodos para análisis, las líneas idénticas de advertencia o error se repiten cientos de veces y ocultan los eventos únicos.
  • Archivos de configuración: las opciones de configuración duplicadas pueden causar comportamientos inesperados según qué ocurrencia utilice el parser.

Modos de comparación

  • Coincidencia exacta (predeterminado): dos líneas son duplicadas solo si son idénticas byte a byte. La línea de salida conserva la capitalización y los espacios originales.
  • Sin distinción entre mayúsculas y minúsculas: convierte ambas líneas a minúsculas antes de comparar. Útil para listas de nombres, direcciones e identificadores que pueden llegar con capitalización inconsistente.
  • Trim antes de comparar: elimina los espacios y tabulaciones del principio y el final antes de comprobar si la línea ya se ha visto. La salida sigue mostrando el contenido original con espacios, pero el criterio de duplicado ignora el relleno.
  • Combinación de sin distinción y trim: el modo más permisivo, que trata como la misma línea las variantes con espacios adicionales y capitalización diferente.

Guía de la herramienta

  • Con qué trabajas Texto multilínea (listas, logs, exportaciones) donde cada línea es una unidad.

  • Qué hace la herramienta Conserva solo la primera aparición de cada línea (opcionalmente recorta antes de comparar).

  • Por qué usarla Limpiar listas de correos/IDs/URLs pegadas de muchas fuentes y preparar filas únicas para importar.

Fragmentos de Código

Deduplicación con Set en 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 en 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

Preguntas frecuentes

¿Para qué sirve esta herramienta?

Funciona por completo en tu navegador: sirve para validar, formatear o convertir datos en el día a día.

¿Se envían mis datos a algún servidor?

El procesamiento es local con JavaScript. No almacenamos lo que pegas en los campos de texto.

¿Puedo usarlo con datos reales en producción?

Úsalo bajo tu responsabilidad. Para secretos (contraseñas, tokens), prefiere entornos controlados y políticas internas. Recuerda de revisar los contenidos generados. Nunca confies ciegamente en cosas que ves en internet.