如何从命令的输出中选取随机元素?

如何从命令的输出中选取随机元素?

如果我有类似的东西:

echo 1 2 3 4 5 6

或者

echo man woman child

我必须在管道后面放什么才能选出1 2 3 4 5 6or的一个元素man woman child

echo 1 2 3 4 5 6 | command
3

答案1

如果你的系统有shuf命令

echo 1 2 3 4 5 | xargs shuf -n1 -e

如果输入确实不是需要通过标准输入进行回显,那么最好使用

shuf -n1 -e 1 2 3 4 5

答案2

如果您没有 shuf (这是一个很棒的工具),但您有 bash,那么这里有一个仅 bash 的版本:

function ref { # Random Element From
  declare -a array=("$@")
  r=$((RANDOM % ${#array[@]}))
  printf "%s\n" "${array[$r]}"
}

你必须颠倒你的调用的意义——使用ref man woman child而不是echo man woman child | command。请注意,这$RANDOM可能不是“强”随机的——请参阅 Stephane 的评论:https://unix.stackexchange.com/a/140752/117549

以下是示例用法和随机 (!) 采样(前导$是 shell 提示符;不要键入它们):

$ ref man woman child
child
$ ref man woman child
man
$ ref man woman child
woman
$ ref man woman child
man
$ ref man woman child
man

$ ref 'a b' c 'd e f'
c
$ ref 'a b' c 'd e f'
a b
$ ref 'a b' c 'd e f'
d e f
$ ref 'a b' c 'd e f'
a b


# showing the distribution that $RANDOM resulted in
$ for loop in $(seq 1 1000); do ref $(seq 0 9); done | sort | uniq -c
  93 0
  98 1
  98 2
 101 3
 118 4
 104 5
  79 6
 100 7
  94 8
 115 9

相关内容