从数组中读取N个元素并删除它们

时间:2014-02-04 10:14:08

标签: arrays bash shell loops awk

我将文件列表存储在数组中。我想做的是循环一个进程,该进程将读取数组的N个元素并删除它刚刚读取的所有元素。 Exception是最后一次迭代,当你进入循环的最后一次迭代时 - 无论数组中剩下什么 - 只是将其拆分出来。

th=$1
ar=('f1' 'f2' 'f3' 'f4' 'f5' 'f6')

for ((i=1; i<=$th; i++)); do

<stuff>
if [ "$i" -eq "$th" ]

then
# if its the last iteration of the loop.Whatever remains in the array - spit that out 
echo " `echo ${ar[*]}`"    >> somefile 

# it its anything short of the last iteration.Read N elements of the array at a time 
# and then delete them 
else
echo " `echo ${ar[*]:0:$N}`  " >> somefile 
     for ((x=0; x<=$N; x++)) ; do
     unset ar[$x]
     done

fi

结果非常不稳定。即使我使用这种方法并单独测试

 for ((x=0; x<=$N; x++)) ; do
     unset ar[$x]
     done

除了$ Nth元素外,它将删除WHOLE数组 我是shell中的数组新手。任何帮助都很高兴

1 个答案:

答案 0 :(得分:2)

尝试以下方法:

#! /bin/bash

th=3
N=2
ar=('f1 f' 'f2' 'f3' 'f4 x' 'f5' 'f6' 'f7')

for ((i=0; i<$th; i++)); do
    if (( $i == $(($th - 1)) )) ; then
       echo "${ar[*]}" 
    else
       echo "${ar[*]:0:$N}" 
       ar=( "${ar[@]:$N}" )
    fi
done

输出:

f1 f f2
f3 f4 x
f5 f6 f7

注意:

  • bash中的数组是零基础的。
  • unset ar[$x]之后不会调整指数,因此将数组重建为ar=( "${ar[@]:$N}" )以强制新指数从零开始会更容易..

<强>更新

或者您可以使用以下方法避免重建数组:

#! /bin/bash

th=3
N=2
ar=('f1 f' 'f2' 'f3' 'f4 x' 'f5' 'f6' 'f7')

for ((i=0; i<$th; i++)); do
    if (( $i == $(($th - 1)) )) ; then
       echo "${ar[*]:$(($i * $N))}" 
    else
       echo "${ar[*]:$(($i * $N)):$N}" 
    fi
done