2010-02-27 92 views
9

我有噴出行數到stdout的命令:挑選隨機線從標準輸出

$ listall 
foo 
bar 
baz 

如何提取此隨機條目,在一襯墊(優選不AWK),以便我可以在管道中使用它:

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

謝謝!

回答

16
listall | shuf | head -n 1 
+0

非常好,正是我所需要的(我對shuf不瞭解) - 謝謝! – AnC 2010-02-27 09:15:38

+10

實際上「listall | shuf -n 1」似乎夠用了 – xiechao 2010-02-27 10:27:36

+1

不是非常便攜:-bash:shuf:找不到命令 – Idelic 2010-03-01 18:33:38

2

使用Perl:

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

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

+0

謝謝。雖然比使用shuf更復雜,但這可能在某個時候派上用場。 – AnC 2010-02-27 09:16:31

2

這是內存安全的,不像使用SHUF或列表::的Util洗牌:

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

只有當listall可以返回一個巨大的結果時,它纔會起作用。請致電reservoir sampling

+0

很高興知道,謝謝!這不是特別的情況,但我甚至沒有想過這個問題... – AnC 2010-02-27 09:46:23

+1

我添加了一個鏈接,更多的信息。 :) – 2010-02-27 09:54:05

2

你可以只用bash中做到這一點,沒有比 「listall」 等其他工具

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

很多很棒的迴應 - 謝謝! – AnC 2010-02-27 10:18:23

+0

這一個需要讀取所有行到內存 – pihentagy 2014-03-13 14:59:17

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他們的安裝,所以也許th更方便:listall | sort -R |head -n 1-R是「隨機排序」。

+1

恐怕'-R'在OS X上不可用。 – AnC 2017-02-04 08:53:49