web-dev-qa-db-ja.com

配列から要素を完全に削除するにはどうすればよいですか?

unset array[0]は要素を削除しますが、削除した場合でもecho ${array[0]}さらにnull値を取得する方法は他にもありますが、配列の要素に以下のようなスペースが含まれている場合

array[0]='james young'
array[1]='mary'
array[2]='randy orton'

しかし、これらはまた仕事をしません

array=${array[@]:1} #removed the 1st element

今、私は新しい配列が

array[0]='mary'
array[1]='randy orton'

スペースは代入後に問題を引き起こし、実際の配列は置換のようになります。

array=(mary randy orton)
53
munish

割り当てで配列構文を使用し、変数を引用します。

array=("${array[@]:1}") #removed the 1st element

編集コメント内の質問に従って。ために $@次のように使用できます:

set -- "${@:2}" #removed the 1st parameter
74
manatwork

これは私に考えさせられました。 sed/awk/tailの問題は、1行ずつ表示されることです。最初の行を削除した後、パターンスペースからファイルに1行おきに書き込む必要があります。

  • 次のコマンドを使用して、必要な操作を数秒で実行できます。
  • これにより、ファイル全体が配列に書き込まれます。
  • 最初の行を削除してファイルに戻します。

    readarray -t aLargeFile < <(cat largefile)
    echo "${aLargeFile[@]:1}" >largefile
    

largefileをファイルの名前に変更するだけです。

0
jgshawkey

特定のインデックスの要素を削除するには、unsetを使用して、別の配列にコピーします。この場合、unsetだけは必要ありません。 unsetは要素を削除しないため、配列内の特定のインデックスにnull文字列を設定するだけです。

declare -a arr=('aa' 'bb' 'cc' 'dd' 'ee')
unset 'arr[1]'
declare -a arr2=()
i=0
for element in ${arr[@]}
do
    arr2[$i]=$element
    ((++i))
done
echo ${arr[@]}
echo "1st val is ${arr[1]}, 2nd val is ${arr[2]}"
echo ${arr2[@]}
echo "1st val is ${arr2[1]}, 2nd val is ${arr2[2]}"

出力は

aa cc dd ee
1st val is , 2nd val is cc
aa cc dd ee
1st val is cc, 2nd val is dd
0
rashok
#!/bin/bash

q=( one two three four five )

echo -e "
  (remove) { [:range:] } <- [:list:]
                | [:range:] => return list with range removed range is in the form of [:digit:]-[:digit:]
"

function remove {
  if [[ $1 =~ ([[:digit:]])(-([[:digit:]]))?   ]]; then
    from=${BASH_REMATCH[1]}
    to=${BASH_REMATCH[3]}
  else
    echo bad range
  fi;shift
  array=( ${@} )
  local start=${array[@]::${from}}
  local rest
  [ -n "$to" ] && rest=${array[@]:((${to}+1))}  || rest=${array[@]:((${from}+1))}
  echo ${start[@]} ${rest[@]}
}

q=( `remove 1 ${q[*]}` )
echo ${q[@]}
~                                                                                                                                                              
~                       
0
MageProspero