Recuperando cinco itens aleatórios de uma lista usando sed

2

Como posso recuperar aleatoriamente cinco itens diferentes de uma lista usando o 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

Eu quero aleatoriamente cinco itens diferentes como estes:

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

Como posso fazer isso?

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

sed -e '1b' -e 's/^*/\x0*/' mypath | gshuf -zn 5 | tr -d '
* 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
0'

mas parece que acabou de adicionar o literal "x0" s em vez de caractere nulo e me deu isto:

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

Existe alguma solução para isso?

    
por stacko 23.06.2016 / 11:21

2 respostas

3

com gnu sed/shuf :

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

Isso transforma a entrada em registros separados nulos, ou seja, em cada linha que começa com * (exceto a primeira), adiciona um caracter antes que a * use shuf com --zero-terminated para extrair cinco registros aleatórios e tr para excluir esses caracteres nulos.

    
por 23.06.2016 / 17:56
2
cat listfile | tr '\n' , | sed 's/,\*/\n*/g;s/,$//' | shuf | head -n 5 | tr , '\n'
    
por 23.06.2016 / 11:52