2010-02-27 2 views
9

У меня есть команда, которая носики количества строк на стандартный вывод:выбирая случайную строку из стандартного вывода

$ listall 
foo 
bar 
baz 

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

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

Спасибо!

ответ

16
listall | shuf | head -n 1 
+0

Отлично, именно то, что мне нужно (я не знал о Шуфе) - спасибо! – AnC

+10

Фактически «listall | shuf -n 1» кажется достаточно – xiechao

+1

Не очень портативный: -bash: shuf: команда не найдена – Idelic

2

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

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

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

+0

Спасибо. Хотя сложнее, чем просто использовать shuf, это может пригодиться когда-нибудь. – AnC

2

Это память безопасно, в отличие от использования Шуфом или списка :: Util перетасовать:

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

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

Дополнительную информацию см. В записи DADS по адресу reservoir sampling.

+0

Полезно знать, спасибо! Это не проблема для этого конкретного случая, но я даже не думал об этом вопросе раньше ... – AnC

+1

Я добавил ссылку с дополнительной информацией. :) –

2

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

$ lists=($(listall)) # put to array 
$ num=${#lists[@]} # get number of items 
$ rand=$((RANDOM%$num)) # generate random number 
$ echo ${lists[$rand]} 
+0

Много замечательных отзывов здесь - спасибо! – AnC

+0

Это нужно прочитать все строки в памяти – pihentagy

0

Сохранить в следующем виде сценария (randomline.sh):

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

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

$ listall | randomline.sh
3

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

+1

Я боюсь, что '-R' недоступен в OS X. – AnC

Смежные вопросы