Bash Scripting

Eliminando eficientemente líneas duplicadas en Bash

Spread the love

Eliminar líneas duplicadas de un archivo de texto es una tarea común en scripts Bash. Este artículo explora dos métodos eficientes: usar sort y uniq, y aprovechar el poder de awk.

Tabla de Contenido

Usando sort y uniq

Este enfoque combina dos utilidades fundamentales de Unix para una solución sencilla. sort ordena las líneas alfabéticamente, un prerrequisito para uniq, que luego elimina los duplicados consecutivos. Se conserva el orden de la primera ocurrencia de cada línea.

Aquí está el comando:


sort file.txt | uniq > file_unique.txt

Esto envía la salida ordenada de file.txt a uniq, guardando las líneas únicas en file_unique.txt. El archivo original permanece intacto.

Ejemplo:

Si file.txt contiene:


apple
banana
apple
orange
banana
grape

file_unique.txt contendrá:


apple
banana
grape
orange

Usando el comando awk

awk ofrece una solución más flexible y potente, particularmente útil cuando es crucial preservar el orden original de las líneas. Emplea una matriz asociativa para rastrear las líneas encontradas.

El comando es notablemente conciso:


awk '!seen[$0]++' file.txt > file_unique.txt

Desglosémoslo:

  • $0 representa toda la línea actual.
  • seen[$0] accede a un elemento en la matriz seen, usando la línea como clave.
  • ++ incrementa posteriormente el valor (inicialmente 0).
  • ! niega el resultado; la línea se imprime solo si se encuentra por primera vez (cuando seen[$0] es 0).

Este método mantiene el orden original de las líneas.

Ejemplo:

Usando el mismo file.txt, la salida en file_unique.txt será:


apple
banana
orange
grape

Conclusión:

Ambos métodos eliminan eficazmente las líneas duplicadas. sort | uniq es más simple para escenarios básicos, mientras que awk proporciona una flexibilidad y un control superiores, especialmente para preservar el orden original o manejar necesidades más intrincadas de eliminación de duplicados.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *