El comando uniq de #GNU

El comando uniq sirve para encontrar texto duplicado adyacente en un archivo

os comandos de GNU coreutils son las herramientas básicas de nuestros sistemas GNU con kernel Linux similares a las de sistemas Unix, para gestionar desde la línea de comandos el sistema y operaciones con archivos de texto.

Vamos a repasar las opciones y uso del comando uniq que sirve para encontrar cadenas de texto duplicado en un archivo y mostrar diferentes resultados.

Antes de empezar para que el comando uniq considere a un texto repetido, este debe estar en líneas adyacentes, consecutivas, juntas o como quieras llamarles.

Es por eso que normalmente se utiliza junto con el comando sort que lo que hace es justamente ordenar el texto y queda así agrupado por líneas similares. (¿os apetece un próximo artículo sobre ese comando?)

Ejecutando uniq

Consideremos que tenemos un archivo que tiene las siguientes 11 líneas. Vemos el contenido con el comando cat:

cat archivo.txt                           
Yo vivo en América
Yo vivo en África
Yo vivo en Oceanía
Yo vivo en Europa
Yo Vivo en Asia
Yo vivo en la luna
Yo vivo en Europa
Yo vivo en Marte
Yo vivo en Asia
Yo vivo en el Polo Norte
Yo vivo en europa

Podemos ordenarlo con el comando sort y ejecutar el comando uniq sin más argumentos. Y nos muestra 10 líneas únicas, ya que «Yo vivo en Europa» está duplicado:

sort archivo.txt | uniq         
Yo vivo en África
Yo vivo en América
Yo vivo en Asia
Yo Vivo en Asia
Yo vivo en el Polo Norte
Yo vivo en europa
Yo vivo en Europa
Yo vivo en la luna
Yo vivo en Marte
Yo vivo en Oceanía

Ignorando mayúsculas y minúsculas

De manera predeterminada, el comando uniq de GNU coreutils diferencia entre mayúsculas y minúsculas. Podemos impedir esa diferenciación con la opción -i lo que nos deja 8 resultados:

sort archivo.txt | uniq -i             
Yo vivo en África
Yo vivo en América
Yo vivo en Asia
Yo vivo en el Polo Norte
Yo vivo en europa
Yo vivo en la luna
Yo vivo en Marte
Yo vivo en Oceanía

Número de ocurrencias encontradas

El comando uniq nos puede mostrar el número de ocurrencias encontradas para cada cadena con la opción -c y además con la opción de sin tener en cuenta la diferencia entre mayúsculas y minúsculas:

sort archivo.txt | uniq -ic     
      1 Yo vivo en África
      1 Yo vivo en América
      2 Yo vivo en Asia
      1 Yo vivo en el Polo Norte
      3 Yo vivo en europa
      1 Yo vivo en la luna
      1 Yo vivo en Marte
      1 Yo vivo en Oceanía

Mostrar solo las líneas duplicadas

Podemos hacer que uniq nos muestre únicamente las líneas que ha encontrado duplicadas con la opción -d

sort archivo.txt | uniq -id        
Yo vivo en Asia
Yo vivo en europa

Solo muestra una vez cada una de las línea duplicadas, es decir, si hay 5 líneas iguales, solo muestra 1 como muestra. Si quieres ver todas las líneas duplicadas, no solo una por cada grupo utiliza la opción -D

sort archivo.txt | uniq -iD        
Yo vivo en Asia
Yo Vivo en Asia
Yo vivo en europa
Yo vivo en Europa
Yo vivo en Europa

Filtrando los caracteres o campos a comprobar

De manera predeterminada uniq comprueba la totalidad de las líneas para compararlas, pero quizás debido a la manera en la que guardamos los datos en nuestro archivo queremos filtrar el texto que queremos que compare.

Compararemos caracteres con la opción -w y un número que indicará los primeros caracteres a comparar. Si buscamos las líneas iguales ignorando mayúsculas y minúsculas de los 7 primeros caracteres lo haremos:

sort archivo.txt | uniq -iw 7     
Yo vivo en África

Solo encuentra una ocurrencia, porque todas empiezan con el mismo texto.

Ahora en vez de decirle que compruebe los primeros 7 caracteres, vamos a decirle que ignore los primeros 11 caracteres y empiece a comparar con el resto mediante la opción -s

sort archivo.txt | uniq -cs 11     
      1 Yo vivo en África
      1 Yo vivo en América
      2 Yo vivo en Asia
      1 Yo vivo en el Polo Norte
      1 Yo vivo en europa
      2 Yo vivo en Europa
      1 Yo vivo en la luna
      1 Yo vivo en Marte
      1 Yo vivo en Oceanía

En vez de indicar el número de caracteres a ignorar, también podemos hacerlo por campos. Un campo es un grupo de caracteres separados por un espacio en blanco. Con la opción -f vamos a indicarle al comando que ignore los primeros 3 campos. Lo que dará un resultado idéntico al anterior:

sort archivo.txt | uniq -cf 3          
      1 Yo vivo en África
      1 Yo vivo en América
      2 Yo vivo en Asia
      1 Yo vivo en el Polo Norte
      1 Yo vivo en europa
      2 Yo vivo en Europa
      1 Yo vivo en la luna
      1 Yo vivo en Marte
      1 Yo vivo en Oceanía


Estás serían las maneras de utilizar este comando escrito para GNU por Richard M. Stallman y David MacKenzie. Quizás útil a la hora de incluirlo en algún script. ¿Te ha parecido instructivo?

Me gustaría saber tu opinión. Deja un comentario (Puedes usar MarkDown)

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.