Answers:
您可以将输出通过管道传递到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
paste
...
paste
那样做。谢谢教我 进行投票。
join
和paste
。这两个工具非常强大。
有没有更简单的方法可以通过单个命令将数组中的项目随机化?
假设您有一个十进制整数数组:
arr=(4 8 14 18 24 29 32 37 42)
您可以使用printf
和shuf
随机化数组的元素:
$ 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
shuf --help
但我尝试在shuf -i 1 10
没有干预的情况下使用-dash.
哦,很好,很好-请多多指教。
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
顺便seq
和printf
为彼此做。例如,如果我想重复一个字符串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
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()
种子基于当前时间的伪随机生成器)。
echo $(seq 10 | shuf)
接近,但不做逗号。