2011-05-06 6 views
5

Quiero barajar las líneas de un archivo con una semilla fija para que siempre obtenga el mismo orden aleatorio. el comando que estoy utilizando es el siguiente:¿Arrastrar líneas de un archivo con una semilla fija?

sort -R file.txt | head -200 > file.sff 

lo que el cambio podría hacer de modo que se ordena con una semilla aleatoria fijo?

Ted

+0

no funciona '--random-source'? – falstro

+1

Acabo de encontrar la respuesta a este yo mismo, pero sí lo es - huevas fuente aleatorias, felicitaciones para ti. – Flethuseo

+0

La respuesta está en este enlace: http://stackoverflow.com/questions/537191/the-sort-r-command-doesnt-sort-lines-randomly-in-linux – Flethuseo

Respuesta

-3

Si va a arrastrar los pies al azar líneas, no toque lavar. No he visto un sort con --random-source antes. Sería interesante si existe. Sin embargo, eso no es ordenar las líneas en un orden fijo.

Creo que tendrás que escribir un programa para eso, y no creo que Bash pueda hacerlo.

En realidad, podría ser. La variable de entorno $ RANDOM selecciona un número aleatorio de 0 a 32767. Puede asignar una semilla a RANDOM y la secuencia de números aleatorios aparecerá una y otra vez. Puede usar un card dealing algorithm. Lea en cada línea una matriz de Bash, luego use el algoritmo de tratamiento de cartas para elegir cada línea.

No voy a escribir un programa de prueba, especialmente en Bash, pero debe entenderse.

5

La implementación de GNU de sort tiene un argumento --random-source. Pasar este argumento con el nombre de un archivo con contenido conocido dará como resultado un conjunto confiable de resultados.

Consulte la documentación Random sources en el manual de GNU coreutils, que contiene la siguiente aplicación de la muestra y ejemplo:

get_seeded_random() 
{ 
    seed="$1" 
    openssl enc -aes-256-ctr -pass pass:"$seed" -nosalt \ 
    </dev/zero 2>/dev/null 
} 

shuf -i1-100 --random-source=<(get_seeded_random 42) 

Desde GNU sort es también parte de coreutils, la documentación pertinente se aplica allí también :

sort --random-source=<(get_seeded_random 42) -R file.txt | head -200 > file.sff 
+0

Dado que 'sort' y' shuf' son ambos parte de GNU coreutils, ¿importa en lo más mínimo? Si uno tiene uno, tendrán ambos. –

+0

@rici, ... editado apropiadamente. –

+0

Si usa HomeBrew en macOS, 'shuf' es' gshuf' (parte del paquete 'coreutils'). – mommi84

0

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.

Cuestiones relacionadas