Puede que no necesite utilizar herramientas externas como sort
, cuyo optio ns y el uso pueden variar según su sistema operativo. Bash tiene un generador interno de números aleatorios accesible a través de la variable $RANDOM
. Es una práctica común la semilla del generador mediante el establecimiento de la variable, así:
RANDOM=$$
o
RANDOM=$(date '+%s')
etc.Pero, por supuesto, también puede utilizar una semilla predecible con el fin de obtener resultados no tan aleatorias predecibles:
$ RANDOM=12345; echo $RANDOM
28207
$ RANDOM=12345; echo $RANDOM
28207
Para reordenar las líneas del archivo asignado al azar, se puede leer el archivo en un usando mapfile gama :
$ mapfile -t a < source.txt
Después, simplemente reescribir los índices de matriz:
$ for i in ${!a[@]}; do a[$((RANDOM+${#a[@]}))]="${a[$i]}"; unset a[$i]; done
Al leer un array no asociativo, golpe naturalmente elementos órdenes en orden ascendente de valor de índice.
Tenga en cuenta que el nuevo índice para cada línea tiene la cantidad de elementos de matriz añadidos para evitar colisiones dentro de ese rango. Esta solución aún es falible: no hay garantía de que $RANDOM
produzca números únicos. Puede mitigar ese riesgo con el código adicional que comprueba para su uso antes de cada índice, o reducir el riesgo de desplazamiento de bit:
... a[$(((RANDOM<<15)+RANDOM+${#a[@]}))]= ...
Esto hace que sus valores de índice en un entero sin signo de 30 bits en lugar de un bit 15 unsigned int.
no funciona '--random-source'? – falstro
Acabo de encontrar la respuesta a este yo mismo, pero sí lo es - huevas fuente aleatorias, felicitaciones para ti. – Flethuseo
La respuesta está en este enlace: http://stackoverflow.com/questions/537191/the-sort-r-command-doesnt-sort-lines-randomly-in-linux – Flethuseo