如何随机化来自seq的输出?


11

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

我想将这些数字随机排列成3、1、4、2 ...

我知道我可以shuf用来改组文件的行。因此,我可以使用seq将随机数写入文件,然后将shuf其随机播放-或编写某种随机播放功能。但这似乎不必要地复杂。有没有更简单的方法可以通过单个命令将数组中的项目随机化?

Answers:


16

您可以将输出通过管道传递到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

但是您必须以某种方式格式化,以逗号分隔一行。echo $(seq 10 | shuf)接近,但不做逗号。
mikeserv

它的水平之前paste...
mikeserv

@mikeserv-改变了它。
slm

是的 你去。我不知道paste那样做。谢谢教我 进行投票。
mikeserv

@mikeserv-是的,阅读了该站点,查看了我的,Stephane或Gilles A的使用joinpaste。这两个工具非常强大。
slm

3

有没有更简单的方法可以通过单个命令将数组中的项目随机化?

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

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)。


如果您需要的只是两个整数之间的随机数,例如1020,则除了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

哎呀 我也看到了这一点,shuf --help但我尝试在shuf -i 1 10没有干预的情况下使用-dash.哦,很好,很好-请多多指教。
mikeserv

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

您甚至不需要for循环。

输出值

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

要将它们放入外壳数组中,请执行以下操作:

( 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

顺便seqprintf为彼此做。例如,如果我想重复一个字符串1000次?

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

输出值

a string

... 999 a 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

...之后38 run行...

run 39

1

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

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

1

POSIXly,以生成从min到的十进制整数的随机列表max

awk -v min=1 -v max=10 'BEGIN{
  for (i = min; i <= max; i++) a[i] = i
  srand()
  for (i = min; i <= max; i++) {
    j = int(rand() * (max - min + 1)) + min
    tmp = a[i]; a[i] = a[j]; a[j] = tmp
  }
  for (i = min; i <= max; i++) print a[i]
}'

请注意,在许多awk实现中,在同一秒内两次运行该命令会产生相同的结果(作为srand()种子基于当前时间的伪随机生成器)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.