выбор случайной строки от stdout

У меня есть команда, которая извергает много строк к stdout:

$ listall
foo
bar
baz

Как делают я извлекаю случайную запись из этого в остроте (предпочтительно без awk), таким образом, я могу просто использовать его в канале:

$ listall | pickrandom | sed ... | curl ...

Спасибо!

9
задан AnC 27 February 2010 в 08:58
поделиться

5 ответов

listall | shuf | head -n 1
17
ответ дан 4 December 2019 в 08:15
поделиться

Использование Perl:

  • perl -MList :: Util = shuffle -e'print ((shuffle <>) [0]) '

  • perl -e'print $ listall [$ key = int rand (@ listall = <>)] '

2
ответ дан 4 December 2019 в 08:15
поделиться

Это безопасно для памяти, в отличие от использования shuf или List :: Util shuffle:

listall | awk 'BEGIN {srand ()} int (rand () * NR) == 0 {x = $ 0} END {print x}'

Это имело бы значение только в том случае, если listall мог вернуть огромный результат.

Для получения дополнительной информации см. Запись DADS о отборе проб коллектора .

2
ответ дан 4 December 2019 в 08:15
поделиться

вы можете сделать это с помощью bash, без других инструментов, кроме listall

$ lists=($(listall)) # put to array
$ num=${#lists[@]} # get number of items
$ rand=$((RANDOM%$num)) # generate random number
$ echo ${lists[$rand]}
2
ответ дан 4 December 2019 в 08:15
поделиться

Сохраните следующее как сценарий (randomline.sh):

#! /bin/sh
set -- junk $(awk -v SEED=$$ 'BEGIN { srand(SEED) } { print rand(), $0 }' | sort -n | head -1)
shift 2
echo "$@"

и запустите его как

$ listall | randomline.sh
0
ответ дан 4 December 2019 в 08:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: