CLI AI

Eliminar líneas duplicadas, con o sin ordenar

2026-08-01

sort -u file.txt elimina las líneas repetidas y ordena lo que queda; awk '!seen[$0]++' file.txt las elimina y conserva el orden original. Cuál quieres depende de si el orden significa algo: en un log siempre significa. uniq por sí solo no hace ninguna de las dos cosas.

1. Por qué uniq solo no sirve

clai
$ clai elimina los duplicados de access.log→ uniq access.log10.0.0.710.0.0.310.0.0.710.0.0.910.0.0.310.0.0.710.0.0.1

El archivo volvió igual. uniq solo colapsa líneas idénticas contiguas, y en un archivo real las repeticiones están dispersas. De ahí la pareja clásica sort | uniq.

2. Quitar duplicados y ordenar

clai
$ clai elimina los duplicados y ordena el archivo→ sort -u access.log10.0.0.110.0.0.310.0.0.710.0.0.9

sort -u hace las dos tareas en una pasada: más corto y más rápido que tirar de una tubería a uniq.

3. Quitar duplicados conservando el orden

clai
$ clai elimina los duplicados pero conserva el orden original de las líneas→ awk '!seen[$0]++' access.log10.0.0.710.0.0.310.0.0.910.0.0.1

Esta es la diferencia real con sort -u: sobrevive la primera aparición de cada línea y el orden queda intacto, lo que importa en logs y en cualquier cosa escrita en orden temporal. El precio es memoria: awk guarda todas las líneas distintas, y eso se nota con archivos de varios gigabytes.

4. Cuántas veces aparece cada línea

clai
$ clai cuenta cuántas veces aparece cada línea→ sort access.log | uniq -c | sort -rn      3 10.0.0.7      2 10.0.0.3      1 10.0.0.9      1 10.0.0.1

La receta del "top N" para logs. uniq -c cuenta y el segundo sort -rn sube las frecuentes.

5. Solo las líneas que se repitieron

clai
$ clai muestra solo las líneas que aparecen más de una vez→ sort access.log | uniq -d10.0.0.310.0.0.7

-d deja solo los duplicados; -u hace lo contrario y deja solo las líneas únicas — 10.0.0.1 y 10.0.0.9 en este archivo. Útil cuando comparas dos listas.

6. Deduplicar por un campo

clai
$ clai deja una línea por cada URL→ awk '!seen[$2]++' req.logGET /a 200GET /b 404

$2 es el segundo campo. Así se colapsa un log por URL, por IP o por identificador de sesión, conservando entera la primera línea que coincide.

Gotchas

  • sort -u archivo > archivo vacía el archivo. Verificado: el shell trunca el archivo para escritura antes de que sort llegue a leerlo, y te quedas con cero líneas. Usa sort -u archivo -o archivo: sort tiene un flag para escribir sobre su propia entrada, y funciona.
  • uniq necesita la entrada ordenada. Sin sort delante devuelve casi el mismo archivo sin decir nada. No es un error, es una respuesta equivocada en silencio.
  • Orden y ordenación son requisitos distintos. sort -u da orden alfabético, awk '!seen[$0]++' da el original. Para logs casi siempre quieres el segundo, y casi todos los artículos enseñan el primero.

Related questions

¿Cómo encuentro las líneas comunes a dos archivos? comm -12 <(sort a.txt) <(sort b.txt). Ambas entradas deben estar ordenadas; para eso está la sustitución de procesos.

¿Cómo ignoro mayúsculas y minúsculas? sort -uf compara sin distinguirlas; awk '!seen[tolower($0)]++' hace lo mismo conservando el orden.

¿Y si el archivo no cabe en memoria? sort -u usa archivos temporales en disco y digiere entradas más grandes que la RAM; la versión con awk puede quedarse sin memoria con ese mismo archivo.

See also

CliAI elige entre la versión que ordena y la que conserva el orden según cómo formules la tarea, y muestra el comando antes. Instálalo en una línea.