Como escolher um elemento aleatório da saída de um comando?

2

Se eu tiver algo como:

echo 1 2 3 4 5 6

ou

echo man woman child

O que devo colocar atrás do pipe para escolher um elemento de 1 2 3 4 5 6 ou man woman child ?

echo 1 2 3 4 5 6 | command
3
    
por Abdul Al Hazred 13.03.2016 / 01:14

2 respostas

9

Se o seu sistema tiver o comando shuf

echo 1 2 3 4 5 | xargs shuf -n1 -e

Se a entrada não precisa ser para ser repetida via entrada padrão, então seria melhor usar

shuf -n1 -e 1 2 3 4 5
    
por 13.03.2016 / 01:29
1

Se você não tiver o shuf (que é uma ótima ferramenta), mas você tem o bash, aqui está uma versão somente do bash:

function ref { # Random Element From
  declare -a array=("$@")
  r=$((RANDOM % ${#array[@]}))
  printf "%s\n" "${array[$r]}"
}

Você teria que reverter o sentido da sua chamada - use ref man woman child em vez de echo man woman child | command . Note que $RANDOM pode não ser "strongmente" aleatório - veja os comentários de Stephane em: link

Veja o exemplo de uso e uma amostragem aleatória (!) (os principais $ são o prompt do shell; não os digite):

$ ref man woman child
child
$ ref man woman child
man
$ ref man woman child
woman
$ ref man woman child
man
$ ref man woman child
man

$ ref 'a b' c 'd e f'
c
$ ref 'a b' c 'd e f'
a b
$ ref 'a b' c 'd e f'
d e f
$ ref 'a b' c 'd e f'
a b


# showing the distribution that $RANDOM resulted in
$ for loop in $(seq 1 1000); do ref $(seq 0 9); done | sort | uniq -c
  93 0
  98 1
  98 2
 101 3
 118 4
 104 5
  79 6
 100 7
  94 8
 115 9
    
por 15.03.2016 / 16:38