我正在使用 AWK 生成 1 - 6 之间的值,这些值需要以随机顺序出现。我设法理清了创建正确数字范围的逻辑,但正在努力将它们读入数组以防止输出重复的数字。目前我的代码有这个;-
BEGIN{
FS=""
}{
for (i=1; i<=6; ++i) {
v=(int (rand()*6)+1
print v }
Run Code Online (Sandbox Code Playgroud)
这当前输出六个数字,但显示重复 2, 2, 6, 1, 4, 2. 我需要输出的是类似 1, 4, 2, 5, 6, 3
任何人都可以为我的 AWK 程序帮助解决这个数组方面的问题吗?
非常感谢
Ed *_*ton 10
为什么使用awk
,至少在大多数 Unix 机器上,你可以这样做:
$ seq 6 | shuf
5
2
3
4
1
6
Run Code Online (Sandbox Code Playgroud)
或如评论中提到的@StéphaneChazelas shuf -i 1-6
。
如果您确实想使用 awk ,那么这里有一种使用Knuth Shuffle 的方法:
$ cat tst.awk
function shuf(arr, i, j, n, tmp) {
n = length(arr)
for (i=n; i>1; i--) {
j = int( 1 + rand()*i )
tmp = arr[i]
arr[i] = arr[j]
arr[j] = tmp
}
}
BEGIN {
srand()
for (i=1; i<=n; i++) { arr[i] = i }
shuf(arr)
for (i=1; i<=n; i++) { print arr[i] }
}
Run Code Online (Sandbox Code Playgroud)
$ awk -v n=6 -f tst.awk
3
1
5
4
6
2
Run Code Online (Sandbox Code Playgroud)
它只是用您想要的值填充一个数组,然后将存储在数组中每个索引处的值与存储在其他随机选择的索引处的值交换,然后打印该数组。
请注意,shuf()
上面的函数在数组的单次传递中工作。