如果我有两个 bash 数组a=(1 2 3 4 5)
和b=(12 23 21 2 3)
. 我需要对它们进行排列,这样如果排列后,数组中的 1 排到a
第三位,那么数组中的 12b
也应该排到第三位。
编辑:为了让我的问题更清楚。我将尝试解释我正在尝试做的事情。我必须随机打乱数组的元素,以便元素的位置发生变化。然后,我得到另一个与第一个数组大小相同的数组。我需要将第二个数组的元素作为第一个数组进行混洗。
如果我有两个 bash 数组a=(1 2 3 4 5)
和b=(12 23 21 2 3)
. 我需要对它们进行排列,这样如果排列后,数组中的 1 排到a
第三位,那么数组中的 12b
也应该排到第三位。
编辑:为了让我的问题更清楚。我将尝试解释我正在尝试做的事情。我必须随机打乱数组的元素,以便元素的位置发生变化。然后,我得到另一个与第一个数组大小相同的数组。我需要将第二个数组的元素作为第一个数组进行混洗。
尝试使用shuf
shell 命令(coreutils)对数组进行洗牌:
$ a=(0 1 2 3 4 5) c=0
$ for i in $(shuf -i 0-$(( ${#a[@]} -1)) ); do b[i]=${a[c++]}; done
$ echo ${b[@]}
2 1 3 0 4 5
如果一个索引总是 1..5 那么这应该工作
b=(${b[a[1-1]-1]} ${b[a[2-1]-1]} ${b[a[3-1]-1]} ${b[a[4-1]-1]} ${b[a[5-1]-1]})
如果 a 被索引为 0..4 会更容易:
b=(${b[a[0]]} ${b[a[1]]} ${b[a[2]]} ${b[a[3]]} ${b[a[4]]})
否则,创建第三个数组 p 将很有用,例如:其中 p 是 {0..$((n-1))} 的排列
p=(3 0 1 2 4)
a=(${a[p[0]]} ${a[p[1]]} ${a[p[2]]} ${a[p[3]]} ${a[p[4]]})
b=(${b[p[0]]} ${b[p[1]]} ${b[p[2]]} ${b[p[3]]} ${b[p[4]]})
如果数组可以是任意大小
atmp=("${a[@]}")
btmp=("${b[@]}")
for ((i=0;i<n;i++)); do
a[i]=${atmp[p[i]]}
b[i]=${btmp[p[i]]}
done
备注这可以改变排列的方向:
atmp=("${a[@]}")
btmp=("${b[@]}")
for ((i=0;i<n;i++)); do
a[p[i]]=${atmp[i]}
b[p[i]]=${btmp[i]}
done