Si eres un usuario de la línea de comandos de Linux y tu trabajo consiste en jugar con archivos de texto, debes saber (si no lo has hecho ya) que existen muchas utilidades de línea de comandos que pueden serte de gran ayuda en diferentes situaciones. Por ejemplo, existe una herramienta denominada 'uniq' que informa o incluso elimina líneas repetidas en un archivo.
En este artículo, discutiremos 'uniq' a través de ejemplos fáciles de entender. Pero antes de hacerlo, vale la pena mencionar que todos los ejemplos e instrucciones mencionados en este tutorial han sido probados en Ubuntu 16.04LTS.
Comando Linux Uniq
Como ya se mencionó al principio, el comando uniq informa u omite líneas repetidas. Esta es la sintaxis general de este comando:
uniq [OPCIÓN]... [ENTRADA [SALIDA]]
De acuerdo con la página del manual de la utilidad:"Filtrar las líneas coincidentes adyacentes desde INPUT (o entrada estándar), escribiendo en OUTPUT (o salida estándar). Sin opciones, las líneas coincidentes se fusionan con la primera aparición".
Los siguientes son algunos ejemplos que lo ayudarán a comprender mejor la herramienta.
1. Cómo eliminar líneas repetidas usando el comando uniq
Supongamos que el archivo contiene las siguientes líneas:
Claramente, cada línea se repite. Ahora ejecutemos Uniq en este archivo y veamos qué sucede.
uniq file1
Entonces, como puede ver, la salida que produjo el comando no contiene líneas repetidas. Tenga en cuenta que el archivo original, 'file1' en nuestro caso, no se ve afectado. Puede redirigir la salida de la herramienta a otro archivo en caso de que quiera guardarlo y trabajar en él.
2. Cómo mostrar el número de repeticiones de cada línea
Si lo desea, también puede hacer que uniq muestre en la salida el número de veces que se repite una línea. Esto se puede hacer usando -c opción de línea de comando. Por ejemplo, el siguiente comando:
uniq -c file1
produce el siguiente resultado:
Entonces, como puede ver, el número de repeticiones para cada línea tiene un prefijo antes en la salida.
3. Cómo imprimir solo líneas duplicadas usando uniq
Para hacer que uniq imprima solo líneas duplicadas, use -D opción de línea de comando. Por ejemplo, suponga que el archivo 1 ahora contiene una línea adicional en la parte inferior (tenga en cuenta que esta línea no se repite).
Ahora, cuando ejecuto el siguiente comando:
uniq -D file1
Se produce el siguiente resultado:
Como puede ver, la opción -D hace que uniq muestre todas las líneas repetidas en la salida, incluidas todas sus repeticiones. Para segregar mejor, puede tener una línea vacía después de cada grupo de líneas repetidas, algo que se puede hacer usando --all-repeated opción.
uniq --todos-repetidos[=MÉTODO] archivo1
Esta opción requiere que el usuario ingrese un nombre de método. Los valores pueden ser antepuestos (para anteponer una línea vacía) o separar (para añadir una línea vacía). Por ejemplo, aquí está esta opción en acción con anteponer método.
Continuando, si desea que la herramienta solo muestre una línea duplicada por grupo, entonces puede optar por -d opción. He aquí un ejemplo de eso:
Claramente, solo se mostró una línea repetida de cada grupo en la salida.
4. Cómo hacer que uniq evite comparar los primeros campos
A veces, dependiendo de la situación, la similitud de dos líneas se define por una pequeña parte de esas líneas. Por ejemplo, considere el contenido del siguiente archivo:
Ahora, suponga que las líneas se consideran similares o diferentes en función de su segundo campo (HTF o FF), y desea transmitir esto a uniq, entonces esto se puede hacer usando -f opción de línea de comando.
uniq -f [number-of-fields-to-skip] [file-name]
La opción -f requiere que pase un número que represente la cantidad de campos que desea que omita el comando. Por ejemplo, en nuestro caso, podemos pasar '1' como argumento a -f ya que es solo el primer campo que queremos que uniq omita.
uniq -f 1 file1
El resultado muestra claramente que uniq consideró tanto la primera como la tercera línea como repetidas en función de sus respectivos segundos campos.
5. Cómo hacer que uniq muestre todas las líneas, mientras separa grupos repetitivos con una línea vacía
En caso de que el requisito sea mostrar todas las líneas, mientras se separan grupos repetitivos de líneas con una línea vacía, puede usar el --group opción. Como el --todo-repetido opción que discutimos anteriormente, --group también requiere que indique la posición de la línea vacía (anteponer , añadir , o ambos ).
He aquí un ejemplo:
Tenga en cuenta que la opción -f ya la hemos discutido en la sección anterior.
6. Cómo hacer que uniq solo imprima líneas no repetitivas
Como ya habrá entendido, de forma predeterminada, el comando uniq solo muestra líneas repetidas en la salida. Pero si lo desea, puede hacer que muestre solo líneas no repetidas o únicas. Esto se puede hacer usando -u opción de línea de comando.
uniq -u [file-name]
Entonces, en nuestro caso:
uniq -u archivo1
He aquí un ejemplo:
Tenga en cuenta que la opción -f ya la hemos discutido en la sección/punto número 4.
7. Cómo hacer que uniq evite comparar un número determinado de caracteres iniciales
En uno de nuestros ejemplos anteriores, discutimos cómo puede hacer que uniq omita campos. Sin embargo, si lo desea, también puede obligar a la herramienta a omitir un número determinado de caracteres iniciales. Se puede acceder a esta función usando -s opción de línea de comando.
uniq -s [número de caracteres] nombre de archivo
Por ejemplo, suponga que el archivo contiene las siguientes líneas:
Ahora, si desea que uniq omita los primeros 4 caracteres de cada línea antes de comparar, puede hacerlo de la siguiente manera:
uniq -s 4 archivo1
Aquí está el comando anterior en acción:
Entonces puede ver que la cuarta línea (faq_forge) que estaba originalmente allí se ha saltado en la salida. Esto se debe a que después de omitir los primeros cuatro caracteres, la tercera y la cuarta línea eran iguales y, por lo tanto, uniq las consideró repetidas.
8. Cómo limitar la comparación para establecer el número de caracteres
Al igual que omite caracteres, también puede pedirle a uniq que limite la comparación a un número determinado de caracteres. Para ello, tendrás que usar la -w opción de línea de comando.
uniq -w [número de caracteres] [nombre de archivo]
Por ejemplo, suponga que el archivo contiene las siguientes líneas:
Ahora, si el requisito es limitar la comparación a los primeros 3 caracteres, esto se puede hacer de la siguiente manera:
uniq -w 3 archivo1
Aquí está el comando anterior en acción:
Dado que los primeros 3 caracteres de la tercera y cuarta líneas son iguales, estas líneas se consideraron repetidas. Por lo tanto, solo se muestra el tercero en la salida.
9. Cómo hacer que la comparación uniq no distinga entre mayúsculas y minúsculas
De forma predeterminada, la comparación que realiza uniq distingue entre mayúsculas y minúsculas. Sin embargo, puede hacer que el proceso no distinga entre mayúsculas y minúsculas usando -i opción de línea de comando.
Por ejemplo, considere el mismo caso que discutimos en la sección anterior, solo que la cuarta línea comienza con H, O y W mayúsculas.
Ahora, si intenta ejecutar el mismo comando que usamos en la sección anterior, verá que el resultado es diferente:
Eso se debe a que los primeros tres caracteres de la tercera y cuarta líneas son diferentes para uniq debido a su mayúscula y minúscula. En estas situaciones, puede hacer que la comparación no distinga entre mayúsculas y minúsculas usando la opción de línea de comando -i.
10. Cómo hacer que la salida uniq termine en NUL
De forma predeterminada, la salida que produce uniq tiene una terminación de nueva línea. Sin embargo, si lo desea, puede tener una salida terminada en NUL (útil al tratar con uniq en scripts). Esto puede hacerse posible usando -z opción de línea de comando.
uniq -z [nombre-archivo]
Conclusión
Hemos cubierto casi todas las opciones de la línea de comandos que ofrece el comando uniq, así que solo practique lo que hemos discutido aquí, y debería tener una idea sólida de cómo funciona uniq y qué características proporciona. Como siempre, en caso de cualquier consulta o duda, consulte primero la página de manual del comando.