如果我有两个bash数组a=(1 2 3 4 5)
和b=(12 23 21 2 3)
。我需要将它们输入,以便如果在排列后,数组a
中的1个位置为第三位,则数组b
中的12位也应转至第三位。
编辑:使我的问题更清晰。我将尝试解释我要做的事情。我必须随机整理一个数组的元素,以便元素的位置发生变化。然后,我得到了另一个与第一个数组相同的数组。
尝试使用 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