根据索引从数组中删除多个元素

时间:2018-05-21 17:03:36

标签: bash

我想根据索引从数组中删除多个元素。

array=("a" "b" "c" "d")
indexes=(1 3)

输出应为

array=("a" "c")

我知道如何从知道元素索引的数组中删除元素:

如果$ i是索引:

array=("${(@)array[1,$i-1]}" "${(@)array[$i+1,$#array]}")

但是如果我要移除多个元素呢?如果我遍历索引数组,一旦我删除了一个元素,其他索引就不再对应要删除的元素。那怎么可能呢?

2 个答案:

答案 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