Recuperando cinco itens aleatórios de uma lista usando sed

Recuperando cinco itens aleatórios de uma lista usando sed

Como posso recuperar cinco itens diferentes selecionados aleatoriamente de uma lista usando sed? Minha lista é algo como abaixo. Cada item começa com um asterisco no início de uma linha.

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

Quero aleatoriamente cinco itens diferentes como estes:

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

Como eu posso fazer isso?

Estou usando OSX e não consegui usar ponto e vírgula no sed e tive que usar gshuf em vez de shuf. Eu tentei isso:

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

mas parece que apenas adicionou o literal "x0" em vez do caractere nulo e me deu isto:

* 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 alguma solução alternativa para isso?

Responder1

Com gnu sed/shuf:

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

Isso transforma a entrada em registros separados por nul, ou seja, em cada linha que começa com a *(exceto a primeira), ele adiciona um caracter nul antes do *switch shufwith --zero-terminatedpara extrair cinco registros aleatórios e trexcluir esses caracteres nulos.

Responder2

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

informação relacionada