
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 shuf
with --zero-terminated
para extrair cinco registros aleatórios e tr
excluir esses caracteres nulos.
Responder2
cat listfile | tr '\n' , | sed 's/,\*/\n*/g;s/,$//' | shuf | head -n 5 | tr , '\n'