从stdout中选择一条随机行

时间:2010-02-27 08:51:53

标签: bash random

我有一个命令,它向stdout喷出了许多行:

$ listall
foo
bar
baz

如何从单行中提取随机条目(最好没有awk),这样我就可以在管道中使用它了:

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

谢谢!

6 个答案:

答案 0 :(得分:17)

listall | shuf | head -n 1

答案 1 :(得分:3)

有些人抱怨他们的安装没有shuf可用,所以可能更容易访问:listall | sort -R |head -n 1-R是"随机排序"。

答案 2 :(得分:2)

使用Perl:

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

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

答案 3 :(得分:2)

这是内存安全的,不像使用shuf或List :: Util shuffle:

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

如果listall可以返回一个巨大的结果,那将是唯一的。

有关详细信息,请参阅reservoir sampling上的DADS条目。

答案 4 :(得分:2)

你可以只使用bash,而不需要“listall”以外的其他工具

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

答案 5 :(得分:0)

将以下内容另存为脚本(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