我有一个命令,它向stdout喷出了许多行:
$ listall
foo
bar
baz
如何从单行中提取随机条目(最好没有awk),这样我就可以在管道中使用它了:
$ listall | pickrandom | sed ... | curl ...
谢谢!
答案 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