¿Cómo puedo aleatorizar las líneas en un archivo usando herramientas estándar en Red Hat Linux?

¿Cómo puedo aleatorizar las líneas en un archivo usando herramientas estándar en Red Hat Linux?

No tengo el comando shuf , entonces estoy buscando algo así como un perl o awk one-liner que lleva a cabo la misma tarea.

¡Y un one-liner de Perl que obtienes!

 perl -MList::Util -e 'print List::Util::shuffle <>' 

Utiliza un módulo, pero el módulo es parte de la distribución del código Perl. Si eso no es lo suficientemente bueno, puedes considerar rodar el tuyo.

Intenté usar esto con el -i (“edit-in-place”) para que edite el archivo. La documentación sugiere que debería funcionar, pero no es así. Todavía muestra el archivo arrastrado a stdout, pero esta vez elimina el original. Sugiero que no lo uses.

Considera un script de shell:

 #!/bin/sh if [[ $# -eq 0 ]] then echo "Usage: $0 [file ...]" exit 1 fi for i in "$@" do perl -MList::Util -e 'print List::Util::shuffle <>' $i > $i.new if [[ `wc -c $i` -eq `wc -c $i.new` ]] then mv $i.new $i else echo "Error for file $i!" fi done 

No probado, pero con suerte funciona.

Um, no lo olvidemos

 sort --random-sort 

shuf es la mejor manera.

sort -R es dolorosamente lento. Solo traté de ordenar el archivo de 5GB. Me di por vencido después de 2.5 horas. Entonces shuf ordenó en un minuto.

 cat yourfile.txt | while IFS= read -rf; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7- 

Lea el archivo, anteponga cada línea con un número al azar, clasifique el archivo en esos prefijos aleatorios, luego corte los prefijos. One-liner que debería funcionar en cualquier caparazón semi-moderno.

EDITAR: incorporó las observaciones de Richard Hansen.

Un trazador de líneas para Python:

 python -c "import random, sys; lines = open(sys.argv[1]).readlines(); random.shuffle(lines); print ''.join(lines)," myFile 

Y para imprimir solo una línea aleatoria:

 python -c "import random, sys; print random.choice(open(sys.argv[1]).readlines())," myFile 

Pero mira esta publicación para conocer los inconvenientes de random.shuffle() de python. No funcionará bien con muchos (más de 2080) elementos.

Relacionado con la respuesta de Jim:

Mi ~/.bashrc contiene lo siguiente:

 unsort () { LC_ALL=C sort -R "$@" } 

Con el género de coreutils de GNU, -R = -R --random-sort , que genera un hash aleatorio de cada línea y ordena por él. El hash aleatorizado no se usaría realmente en algunas configuraciones regionales en algunas versiones anteriores (con fallas), haciendo que devuelva resultados ordenados normales, por lo que configuro LC_ALL=C


Relacionado con la respuesta de Chris:

 perl -MList::Util=shuffle -e'print shuffle<>' 

es un trazador de líneas ligeramente más corto. ( -Mmodule=a,b,c es la abreviatura de -e 'use module qw(abc);' )

La razón por la que le da un simple -i no funciona para mezclar en el lugar es porque Perl espera que la print ocurra en el mismo ciclo en que se lee el archivo, y la print shuffle <> no sale hasta que todos los archivos de entrada tengan leído y cerrado

Como una solución más corta,

 perl -MList::Util=shuffle -i -ne'BEGIN{undef$/}print shuffle split/^/m' 

mezclará los archivos en el lugar. ( -n significa “ajustar el código en un ciclo while (<>) {...} ; BEGIN{undef$/} hace que Perl opere en archivos a la vez en lugar de líneas a la vez, y split/^/m es necesario porque $_=<> se ha realizado implícitamente con un archivo completo en lugar de líneas).

Cuando instalo coreutils con homebrew

 brew install coreutils 

shuf está disponible como n .

Mac OS X con DarwinPorts:

 sudo port install unsort cat $file | unsort | ... 

FreeBSD tiene su propia utilidad aleatoria:

 cat $file | random | ... 

Está en / usr / games / random, así que si no has instalado juegos, no tienes suerte.

Podría considerar la instalación de puertos como textproc / rand o textproc / msort. Estos podrían estar disponibles en Linux y / o Mac OS X, si la portabilidad es una preocupación.

En OSX, obteniendo lo último de http://ftp.gnu.org/gnu/coreutils/ y algo así como

./configure make sudo make install

… debería darle / usr / local / bin / sort –random-sort

sin arruinar / usr / bin / sort

O consíguelo de MacPorts:

 $ sudo port install coreutils 

y / o

 $ /opt/local//libexec/gnubin/sort --random-sort