
¿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 shuf
with --zero-terminated
switch para extraer cinco registros aleatorios y tr
eliminar esos caracteres nulos.
Respuesta2
cat listfile | tr '\n' , | sed 's/,\*/\n*/g;s/,$//' | shuf | head -n 5 | tr , '\n'