выбирая случайную строку из стандартного вывода - PullRequest
9 голосов
/ 27 февраля 2010

У меня есть команда, которая выводит несколько строк в стандартный вывод:

$ listall
foo
bar
baz

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

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

Спасибо!

Ответы [ 6 ]

17 голосов
/ 27 февраля 2010
listall | shuf | head -n 1
3 голосов
/ 22 августа 2016

Некоторые жаловались на отсутствие shuf в своих установках, поэтому, возможно, это более доступно: listall | sort -R |head -n 1. -R "сортировать случайным образом".

2 голосов
/ 27 февраля 2010

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

$ lists=($(listall)) # put to array
$ num=${#lists[@]} # get number of items
$ rand=$((RANDOM%$num)) # generate random number
$ echo ${lists[$rand]}
2 голосов
/ 27 февраля 2010

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

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

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

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

2 голосов
/ 27 февраля 2010

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

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

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

0 голосов
/ 01 марта 2010

Сохраните следующее как скрипт (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...