我想根据索引从数组中删除多个元素。
array=("a" "b" "c" "d")
indexes=(1 3)
输出应为
array=("a" "c")
我知道如何从知道元素索引的数组中删除元素:
如果$ i是索引:
array=("${(@)array[1,$i-1]}" "${(@)array[$i+1,$#array]}")
但是如果我要移除多个元素呢?如果我遍历索引数组,一旦我删除了一个元素,其他索引就不再对应要删除的元素。那怎么可能呢?
答案 0 :(得分:3)
使用BASH数组,您可以轻松完成此任务:
# original array
array=("a" "b" "c" "d")
# indexes array
indexes=(1 3)
# loop through indexes array and delete from element array
for i in "${indexes[@]}"; do
unset "array[$i]"
done
# check content of original array
declare -p array
declare -a array=([0]="a" [2]="c")
根据Chepner的评论,如果OP想要一系列连续索引,那么循环通过差分数组并填充一个新数组
# result array
out=()
# loop through differential array and populate result
for i in "${array[@]}"; do
out+=("$i")
done
declare -p out
declare -a out=([0]="a" [1]="c")
答案 1 :(得分:0)
假设indices
已排序,请保留已删除的项目数的计数器,并从循环中的每个索引中减去该项目。
count=0
for i in $indices; do
c=$((i - count))
array=("${(@)array[1,$c-1]}" "${(@)array[$c+1,$#array]}")
count=$((count + 1))
done
在bash
中,相同的方法看起来像
count=0
for i in "${indices[@]}"; do
c=$((i - count))
array=( "${array[@]:0:c-1}" "${array[@]:c+1}" )
count=$((count + 1))
done