Recuperar cinco elementos aleatorios de una lista usando sed

Recuperar cinco elementos aleatorios de una lista usando sed

¿Cómo puedo recuperar cinco elementos diferentes seleccionados al azar de una lista usando sed? Mi lista es algo así como a continuación. Cada elemento comienza con un asterisco al principio de una línea.

* asterisk*
star
wildcard
* bee
hive
* car
tire
drive
* dove
white
peace
* eel
slippery
* fin
fish
* goat
* hinge
door
* ice
cold
* jam
bread

Quiero cinco elementos diferentes al azar como estos:

* hinge
door
* ice
cold
* jam
bread
* asterisk*
star
wildcard
* eel
slippery

¿Cómo puedo hacer eso?

Estoy usando OSX y no podía usar punto y coma en sed y tuve que usar gshuf en lugar de shuf. Probé esto:

sed -e '1b' -e 's/^*/\x0*/' mypath | gshuf -zn 5 | tr -d '\000'

pero parece que acaba de agregar los "x0" literales en lugar del carácter nulo y me dio esto:

* asterisk*
star
wildcard
x0* bee
hive
x0* car
tire
drive
x0* dove
white
peace
x0* eel
slippery
x0* fin
fish
x0* goat
x0* hinge
door
x0* ice
cold
x0* jam
bread

¿Existe alguna solución para esto?

Respuesta1

Con gnu sed/shuf:

sed '1b;s/^*/\x0*/' infile | shuf -zn 5 | tr -d '\000'

Esto convierte la entrada en registros separados por nulos, es decir, en cada línea que comienza con a *(excepto la primera), agrega un carácter nulo antes de *usar shufwith --zero-terminatedswitch para extraer cinco registros aleatorios y treliminar esos caracteres nulos.

Respuesta2

cat listfile | tr '\n' , | sed 's/,\*/\n*/g;s/,$//' | shuf | head -n 5 | tr , '\n'

información relacionada