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?
