Cómo usar el comando uniq en Linux

El comando uniq en Linux recorre tus archivos de texto en busca de líneas únicas o duplicadas. En esta guía, cubrimos su versatilidad y características, así como también cómo puedes aprovechar al máximo esta ingeniosa utilidad.

Encontrar líneas de texto coincidentes en Linux

El comando uniq es rápido, flexible y excelente en lo que hace. Sin embargo, al igual que muchos comandos de Linux, tiene algunas peculiaridades, lo cual está bien, siempre y cuando sepas sobre ellas. Si das el paso sin un poco de conocimiento interno, es muy posible que te quedes rascándote la cabeza ante los resultados. Señalaremos estas peculiaridades a medida que avanzamos.

El comando uniq es perfecto para aquellos que tienen una sola cosa en mente, está diseñado para hacer una cosa y hacerlo bien. Es por eso que también es particularmente adecuado para trabajar con tuberías y desempeñar su papel en los comandos de tuberías. Uno de sus colaboradores más frecuentes es sort porque uniq tiene que haber ordenado las entradas para trabajar.

¡Vamos a utilizarlo!

Ejecutando uniq sin opciones

Tenemos un archivo de texto que contiene la letra de la canción I Believe I’ll Dust My Broom de Robert Johnson.  Veamos qué hace con uniq esto.

Escribiremos lo siguiente para canalizar la salida a less:

Obtenemos toda la canción, incluidas las líneas duplicadas, con less:

Eso no parece ser ni las líneas únicas ni las líneas duplicadas.

Correcto, porque esta es la primera peculiaridad. Si ejecutas uniq sin opciones, se comporta como si utilizaras la opción –u (líneas únicas). Esto le indica a uniq que imprima solo las líneas únicas del archivo. La razón por la que ves líneas duplicadas es porque, para que uniq considere una línea como duplicada, debe estar adyacente a su duplicado. Aquí es donde sort entra en juego.

Cuando ordenamos el archivo, agrupa las líneas duplicadas y uniq las trata como duplicadas. Usaremos sort en el archivo, canalizaremos la salida ordenada con uniq y luego canalizaremos la salida final con less.

Para hacerlo, escribimos lo siguiente:

Aparece una lista ordenada de líneas con less.

La frase, ” I believe I’ll dust my broom “, definitivamente aparece en la canción más de una vez. De hecho, se repite dos veces dentro de las primeras cuatro líneas de la canción.

Entonces, ¿por qué aparece en una lista de líneas únicas? Debido a que la primera vez que aparece una línea en el archivo, es única; solo las entradas posteriores son duplicados. Puedes considerarlo como una lista de la primera aparición de cada línea única.

Usemos sort nuevamente y redirijamos la salida a un nuevo archivo. De esta manera, no tenemos que usar sort en cada comando.

Escribimos el siguiente comando:

Ahora, tenemos un archivo ordenado para trabajar.

Contando duplicados

Puedes usar la opción –c (contar) para imprimir la cantidad de veces que aparece cada línea en un archivo.

Escribe el siguiente comando:

Cada línea comienza con la cantidad de veces que esa línea aparece en el archivo. Sin embargo, notarás que la primera línea está en blanco. Esto te indica que hay cinco líneas en blanco en el archivo.

Si deseas que la salida se establezca en orden numérico, puedes canalizar la salida desde uniqsort. En nuestro ejemplo, usaremos las opciones –r (inversa) y  -n (ordenación numérica), y canalizaremos los resultados con less.

Escribimos lo siguiente:

La lista se clasifica en orden descendente en función de la frecuencia de aparición de cada línea.

Listado solo de líneas duplicadas

Si deseas ver solo las líneas que se repiten en un archivo, puedes usar la opción -d (repetida). No importa cuántas veces se duplica una línea en un archivo, se enumera solo una vez.

Para usar esta opción, escribimos lo siguiente:

Las líneas duplicadas se enumeran para nosotros. Notarás la línea en blanco en la parte superior, lo que significa que el archivo contiene líneas en blanco duplicadas.  No es un espacio dejado por uniq para compensar cosméticamente la lista.

También podemos combinar las opciones –d (repetidas) y –c (contar) y canalizar la salida sort. Esto nos da una lista ordenada de las líneas que aparecen al menos dos veces.

Escribe lo siguiente para usar esta opción:

Listado de todas las líneas duplicadas

Si deseas ver una lista de cada línea duplicada, así como una entrada para cada vez que aparece una línea en el archivo, puedes usar la opción –D (todas las líneas duplicadas).

Para usar esta opción, escribe lo siguiente:

El listado contiene una entrada para cada línea duplicada.

Si usas la opción –group, imprime cada línea duplicada con una línea en blanco antes (prepend). O después de cada grupo (append), o antes y después (both) de cada grupo.

Estamos utilizando append como nuestro modificador, por lo que escribimos lo siguiente:

Los grupos están separados por líneas en blanco para que sean más fáciles de leer.

Comprobación de cierto número de caracteres

Por defecto, uniq verifica la longitud completa de cada línea. Sin embargo, si deseas restringir los controles a un cierto número de caracteres, puedes usar la opción –w (verificar caracteres).

En este ejemplo, repetiremos el último comando, pero limitaremos las comparaciones a los primeros tres caracteres. Para hacerlo, escribimos el siguiente comando:

Los resultados y las agrupaciones que recibimos son bastante diferentes.

Todas las líneas que comienzan con “I b” se agrupan porque esas partes de las líneas son idénticas, por lo que se consideran duplicados.

Del mismo modo, todas las líneas que comienzan con “I’m” se tratan como duplicados, incluso si el resto del texto es diferente.

Ignorar un cierto número de caracteres

Hay algunos casos en los que puede ser beneficioso omitir un cierto número de caracteres al comienzo de cada línea. Por ejemplo, cuando las líneas de un archivo están numeradas. O bien, supongamos que uniq necesita saltar sobre un registro temporal y comenzar a verificar las líneas del carácter seis en lugar del primer carácter.

A continuación, se muestra una versión de nuestro archivo ordenado con líneas numeradas.

Si queremos que uniq comience a verificar la comparación en el caracter tres, podemos usar la opción –s (omitir caracteres) escribiendo lo siguiente:

Las líneas se detectan como duplicados y se cuentan correctamente. Observa que los números de línea que se muestran son los de la primera aparición de cada duplicado.

También puedes omitir campos (una serie de caracteres y algunos espacios en blanco) en lugar de caracteres. Usaremos la opción –f (campos) para decirle a uniq qué campos ignorar.

Escribimos lo siguiente para indicar a uniq que ignore el primer campo:

Obtenemos los mismos resultados que obtuvimos cuando le dijimos a uniq que omitiera tres caracteres al comienzo de cada línea.

Ignorando mayúsculas y minúsculas

Por defecto, uniq distingue entre mayúsculas y minúsculas. Si la misma letra aparece en mayúscula y minúscula, uniq considera que las líneas son diferentes.

Por ejemplo, verifica el resultado del siguiente comando:

Las líneas ” I Believe I’ll dust my broom ” y ” I believe I’ll dust my broom ” no se tratan como duplicados debido a la diferencia en el caso de la “B” en “believe”.

Sin embargo, si incluimos la opción –i (ignorar mayúsculas y minúsculas), estas líneas se tratarán como duplicados. Para comprobar escribimos lo siguiente:

Las líneas ahora se tratan como duplicados y se agrupan.

Conclusión

Linux pone a tu disposición multitud de utilidades especiales. Como muchas de ellas, uniq no es una herramienta que usarás todos los días.

Es por eso que una gran parte de convertirse en experto en Linux es recordar qué herramienta resolverá tu problema actual y dónde puedes encontrarla. Sin embargo, si practicas, estarás muy encaminado.

O bien, siempre puedes buscar  Binaria, probablemente tengamos un artículo al respecto.