El comando shuf en Linux: mezclar líneas aleatoriamente

Introducción

En el mundo de la línea de comandos de Linux, existen numerosas utilidades diseñadas para manipular texto de forma rápida y eficiente. Entre ellas, shuf destaca por su capacidad de mezclar líneas de entrada de manera aleatoria, una tarea que resulta útil en pruebas, generación de datos de ejemplo, creación de listas aleatorias y muchos otros escenarios. Este artículo explora en profundidad el comando shuf, su sintaxis, sus opciones más habituales y algunos ejemplos prácticos que puedes aplicar inmediatamente en tu flujo de trabajo.

¿Qué hace exactamente shuf?

shuf pertenece al paquete GNU coreutils y su función principal es leer líneas de un archivo o de la entrada estándar y volver a ordenarlas de forma aleatoria. Cada ejecución produce una permutación diferente, siempre que el generador de números aleatorios no se inicialice con la misma semilla. La herramienta no modifica el archivo original; simplemente escribe el resultado en la salida estándar, lo que permite redirigirlo a otro archivo o encadenarlo con otros comandos mediante tuberías.

Sintaxis básica

La forma más directa de usar shuf es indicar el archivo de entrada:

shuf nombre_del_archivo.txt

Si no se especifica ningún archivo, shuf leerá desde la entrada estándar, lo que permite combinarlo con otros comandos:

cat lista.txt | shuf

El resultado será las mismas líneas pero en un orden impredecible cada vez que lo invoques.

Opciones más usadas

  • -n NUM o –head-count=NUM: muestra solo las primeras NUM líneas después de mezclar. Esto es equivalente a tomar una muestra aleatoria de tamaño NUM.
  • -e o –echo: trata cada argumento de la línea de comandos como una línea de entrada. Por ejemplo, shuf -e manzana pera naranja producirá una permutación de esas tres palabras.
  • -i LO-HI o –input-range=LO-HI: genera una secuencia de números desde LO hasta HI inclusive y luego la mezcla. Muy útil para crear sorteos o seleccionar índices al azar.
  • –repeat: permite que la salida contenga líneas duplicadas. Sin esta opción, cada línea de entrada aparece a lo sumo una vez en el resultado.
  • -z o –zero-terminated: cambia el delimitador de línea a un carácter nulo, lo que facilita el manejo de nombres de archivo que contienen espacios o saltos de línea.

Ejemplos prácticos

Mezclar un archivo de registro

Supongamos que tienes un archivo log.txt con miles de entradas y deseas obtener una muestra aleatoria de 100 líneas para inspección rápida:

shuf -n 100 log.txt

Este comando mezcla todo el archivo y luego muestra solo las primeras cien líneas, proporcionando una representación estadísticamente válida del contenido completo.

Generar números de lotería

Para simular un sorteo de seis números entre 1 y 49, puedes usar el rango de entrada:

shuf -i 1-49 -n 6

Cada ejecución producirá un conjunto distinto de seis números, siempre que no se active la opción –repeat.

Crear una lista aleatoria de palabras

Si tienes un diccionario en formato una palabra por línea llamado diccionario.txt y deseas obtener diez palabras al azar:

shuf -n 10 diccionario.txt

Esta técnica se emplea frecuentemente en la generación de contraseñas memorables o en la creación de datos de prueba para aplicaciones.

Combinar shuf con otros comandos

El poder de shuf se potencia cuando se usa en tuberías. Por ejemplo, para obtener un listado aleatorio de los procesos que consumen más memoria:

ps -eo pid,ppid,cmd,%mem --sort=-%mem | shuf -n 5

Primero se lista todos los procesos ordenados por uso de memoria, luego se mezcla la salida y se muestran las cinco primeras líneas, obteniendo una muestra aleatoria entre los procesos más consumidores.

Manejo de nombres de archivo con espacios

Cuando los nombres de archivo pueden contener espacios o caracteres especiales, es recomendable usar el delimitador nulo:

find . -type f -print0 | shuf -z -n 5 | xargs -0 ls -lh

Este comando encuentra todos los archivos, los pasa a shuf mediante un flujo nulo, selecciona cinco de forma aleatoria y luego muestra sus detalles con ls.

Alternativas y complementos

Aunque shuf es la herramienta más directa para mezclar líneas, existen otras opciones que pueden ser útiles según el contexto. El comando sort -R también ordena de forma aleatoria, pero su algoritmo de aleatoriedad puede diferir y no garantiza la misma distribución uniforme que shuf en todas las versiones de coreutils. Otra alternativa es usar awk con la función rand() para asignar un número aleatorio a cada línea y luego ordenar por ese valor. Estas técnicas pueden ser válidas cuando se trabaja en entornos donde shuf no está disponible o cuando se necesita un control más fino sobre la semilla de aleatoriedad.

Establecer una semilla para reproducibilidad

En algunos escenarios, como la depuración de scripts o la generación de informes que deben ser idénticos entre ejecuciones, resulta útil fijar la semilla del generador de números aleatorios. shuf respeta la variable de entorno GNU_SHUF_RANDOM_SOURCE. Si se asigna a un archivo o a un dispositivo como /dev/urandom, se puede influir en la fuente de entropía. Por ejemplo, ejecutar GNU_SHUF_RANDOM_SOURCE=./semilla.bin shuf -n 10 datos.txt hará que shuf lea los bytes de semilla.bin para inicializar su generador, lo que producirá la misma permutación siempre que el contenido de semilla.bin no cambie.

Tips de rendimiento

shuf necesita leer toda la entrada en memoria para poder crear una permutación uniforme. Por ello, con archivos muy grandes (varios gigabytes) el consumo de RAM puede devenir elevado. En esos casos, se puede dividir el archivo en trozos más pequeños usando split, aplicar shuf a cada fragmento y luego combinar los resultados con cat o una mezcla adicional. Otra estrategia es utilizar herramientas de flujo como perl -MList::Util=shuffle -e 'print shuffle <>' que pueden trabajar de forma más ligera en ciertos escenarios, aunque sacrifican la garantía de uniformidad estricta que ofrece shuf.

Buenas prácticas al usar shuf en scripts

Cuando integres shuf en scripts de shell, considera los siguientes puntos:

  • Always check the exit status of shuf to detect errors, especially when reading from files that might be missing or inaccessible.
  • Use absolute paths or reliable relative paths to avoid surprises when the script is executed from different directories.
  • If you need reproducible results for testing, export a fixed value for GNU_SHUF_RANDOM_SOURCE at the beginning of the script.
  • Be mindful of temporary files; if you create intermediate files, ensure they are cleaned up in a trap or at the end of the script.
  • When dealing with user‑supplied input, validate that the data does not contain unexpected null bytes if you are not using the -z option.

Conclusión

El comando shuf es una herramienta simple pero poderosa para cualquier usuario de Linux que necesite aleatorizar líneas de texto. Su sintaxis clara, combinada con opciones útiles como -n, -e, -i y –repeat, lo convierte en un aliado indispensable para pruebas, generación de datos, sorteos y automatización de tareas. Al comprender su funcionamiento y sus limitaciones, puedes integrarlo de manera efectiva en scripts y flujos de trabajo diarios, ahorrando tiempo y asegurando resultados impredecibles cuando los necesites.

Esta obra está bajo una Licencia Creative Commons Atribución 4.0 Internacional para Francesc Roig francesc@vivaldi.net .

EspañolesEspañolEspañol