Como posso remover um elemento de uma matriz completamente?

40

unset array[0] remove o elemento, mas ainda assim, se eu obtiver echo ${array[0]} , obtenho um valor nulo, além disso, há outras maneiras de fazer isso, mas se um elemento de uma matriz contiver espaços como abaixo

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

mas estes também não conseguem fazer o trabalho

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

agora quero que o novo array seja como

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

Os espaços causam o problema após a atribuição e a matriz real se torna semelhante à substituição.

array=(mary randy orton)
    
por munish 18.03.2013 / 13:28

4 respostas

57

Basta usar a sintaxe de matriz na atribuição e citar sua variável:

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

Editar de acordo com a pergunta no comentário. Para $@ você pode usá-lo assim:

set -- "${@:2}" #removed the 1st parameter
    
por 18.03.2013 / 13:32
0

Isso me fez pensar. O problema com sed / awk / tail é que eles são linha por linha. Depois de apagar a primeira linha, você deve escrever todas as outras linhas do espaço padrão para o arquivo.

  • Você pode usar os seguintes comandos para fazer o que quiser em segundos.
  • Isso gravará o arquivo inteiro em uma matriz.
  • Remova a primeira linha enquanto ela é despejada de volta no arquivo.

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

Basta alterar o largefile para o nome do seu arquivo.

    
por 29.04.2016 / 23:09
0

Para remover um elemento em um determinado índice, podemos usar unset e copiar para outro array. Somente apenas unset não é necessário neste caso. Como unset não remove o elemento, ele apenas define a cadeia nula para o índice específico na matriz.

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]}"

A saída é

aa cc dd ee
1st val is , 2nd val is cc
aa cc dd ee
1st val is cc, 2nd val is dd
    
por 03.04.2018 / 11:44
-1
#!/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[@]}
~                                                                                                                                                              
~                       
    
por 29.06.2013 / 10:11