如何随机化 seq 的输出?

如何随机化 seq 的输出?

我知道我可以用来seq生成随机数字列表:1、2、3、4...

我想将这些数字按随机顺序排列,例如 3、1、4、2...

我知道我可以用来shuf打乱文件的行。所以我可以用来seq将随机数写入文件,然后用来shuf对它们进行洗牌——或者编写某种洗牌函数。但这似乎不必要地复杂。有没有一种更简单的方法可以使用单个命令随机化数组中的项目?

答案1

您只需将输出通过管道传输到shuf.

$ seq 100 | shuf

例子

$ seq 10 | shuf
2
6
4
8
1
3
10
7
9
5

如果您希望输出是水平的,则将其通过管道传输到paste.

$ seq 10 | shuf | paste - -s -d ' '
1 6 9 3 8 4 10 7 2 5 

$ seq 10 | shuf | paste - -s -d ' '
7 4 6 1 8 3 10 5 9 2 

$ seq 10 | shuf | paste - -s -d ' '
9 8 3 6 1 2 10 4 7 5 

想要中间用逗号吗?将分隔符更改为paste

$ seq 10 | shuf | paste - -s -d ','
2,4,9,1,8,7,3,5,10,6

答案2

有没有一种更简单的方法可以使用单个命令随机化数组中的项目?

假设您有一个十进制整数数组:

arr=(4 8 14 18 24 29 32 37 42)

您可以使用printfshuf来随机化数组的元素:

$ arr=($(printf "%d\n" "${arr[@]}" | shuf))
$ echo "${arr[@]}"
4 37 32 14 24 8 29 42 18

(以上假设您没有修改$IFS)。


如果您需要的只是两个整数之间的随机数,例如10和,则除了使用以下选项20之外,您不需要任何额外的过程:shuf-i

$ shuf -i 10-20
12
10
20
14
16
19
13
11
18
17
15

引用自man shuf

   -i, --input-range=LO-HI
          treat each number LO through HI as an input line

答案3

printf '%s, ' `seq 1 10 | shuf`

你甚至不需要循环for

输出

7, 3, 4, 10, 2, 9, 1, 8, 5, 6,

要将它们放入 shell 数组中,您可以执行以下操作:

( set -- $(seq 1 10 | shuf) ; printf '%s, ' "$@" )

输出

5, 9, 7, 2, 4, 3, 6, 1, 10, 8,

然后它们就在你的 shell 数组中。

如果你把它们放在 shell 数组中,你甚至不需要printf

( set -- $(seq 1 10 | shuf); IFS=, ; echo "$*" )

输出

9,4,10,3,1,2,7,5,6,8

顺便说一下,seq他们printf是天生的一对。例如,如果我想重复一个字符串 1000 次?

printf 'a string\n%.0b' `seq 1 1000`

输出

a string

... 999a string行之后...

a string

或者...

printf 'a string,%.0b' `seq 1 10`

输出

a string,a string,a string,a string,a string,a string,a string,a string,a string,a string,

我想执行一个命令39次?

printf 'echo "run %d"\n' `seq 1 39` | . /dev/stdin

输出

run 1

... 38run行之后...

run 39

答案4

您可以使用shuf命令随机化输出,例如

%> for x in $(seq 1 10 | shuf); do echo -n "$x "; done; echo
4 10 8 7 1 6 3 5 2 9 

相关内容