2

如果我有两个 bash 数组a=(1 2 3 4 5)b=(12 23 21 2 3). 我需要对它们进行排列,这样如果排列后,数组中的 1 排到a第三位,那么数组中的 12b也应该排到第三位。

编辑:为了让我的问题更清楚。我将尝试解释我正在尝试做的事情。我必须随机打乱数组的元素,以便元素的位置发生变化。然后,我得到另一个与第一个数组大小相同的数组。我需要将第二个数组的元素作为第一个数组进行混洗。

4

2 回答 2

2

尝试使用shufshell 命令(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
于 2012-11-10T21:18:00.647 回答
-1

如果一个索引总是 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
于 2012-11-10T21:00:03.577 回答