Bir öğeyi bir diziden tamamen nasıl kaldırabilirim?


48

unset array[0]öğeyi kaldırır, ancak yine de echo ${array[0]}boş bir değer elde edersem, üstelik bunu yapmanın başka yolları da var;

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

ancak bunlar da işi yapamıyor

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

şimdi yeni dizinin benzemesini istiyorum

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

Boşluklar atamadan sonra soruna neden olur ve asıl dizi ikame ile aynı hale gelir.

array=(mary randy orton)

4
Hayır, boşluklar sorun çıkarmaz, fakat alıntı yapılmamasıdır.
Manatwork

Yanıtlar:


68

Sadece ödevde dizi sözdizimini kullanın ve değişkeninizi belirtin:

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

Yorumdaki soruya göre düzenleyin. Bunun için $@kullanabilirsiniz:

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

8
1. elemanı değil, 0 dizininin elemanını kaldırdığını ve dizinleri yeniden atadığını unutmayın. Eğer ilk eleman 12 endeksindeyse, hiçbir şeyi kaldırmaz, ancak endeksleri yeniden atar, böylece bir zamanlar endeks 12'de olan şey şimdi endeks 0'da olacaktır. gelecekteki referans. Davranış, zshdizileri ksh veya bash'a aykırı olarak seyrek olmayanlardan farklıdır .
Stéphane Chazelas

3
Selam @StephaneChazelas. "Endekslerin" tekil "bir indeks ". Yorumun için teşekkürler!
Steven Lu,

3
@ manatwork - re: senin düzenlemen - neden kullanmıyorsun shift?
don_crissti

1
@ don_crissti, iyi nokta. İndeksleme farkına odaklandım ve daha fazla düşünmedim. Aynı zamanda, örneğin son 3'ü tutabilmek için, değişken miktardaki maddeleri atmanız gerektiğinde durumu aklımdaydı: array=("${array[@]: -3}")ve set -- "${@: -3}". Bu yüzden endekslerde sıkışmış.
Manat çalışması

1
shift $[$#-3]Son 3 için muhtemelen çok daha hızlı$@
Tino

0

Bu beni düşündürdü. Sed / awk / tail ile ilgili sorun, satır satır olmalarıdır. İlk satırı sildikten sonra diğer tüm satırları desen uzayından dosyaya yazmak zorundasınız.

  • Saniyeler içinde istediğinizi yapmak için aşağıdaki komutları kullanabilirsiniz.
  • Bu işlem tüm dosyayı bir diziye yazacaktır.
  • İlk satırı, dosyaya geri dökerken çıkartın.

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

largefileDosyanızın adını değiştirin .


Neden sed -i 1d largefileonun yerine kullanmıyorsun ? Bu RAM + değiş
Tino

0

Belirli bir dizindeki bir öğeyi kaldırmak için kullanabiliriz unsetve sonra başka bir diziye kopyalayabiliriz. Sadece unsetbu durumda gerekli değildir. Çünkü unsetelemanı kaldırmaz sadece dizideki belirli endekse boş dize ayarlar.

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

Çıktı

aa cc dd ee
1st val is , 2nd val is cc
aa cc dd ee
1st val is cc, 2nd val is dd

-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[@]}
~                                                                                                                                                              
~                       

4
Sadece bir kod bloğu değil, nasıl çalıştığını açıklayacak bir şey olsaydı bu daha iyi olurdu. Ve alt kısımdaki tilde neyin var?
16'da,

3
Cidden, haklısın. Bu bir holigan tarafından yazılmış gibi görünüyor, ama teşekkür ederim. Bunu sadece hamburger porsiyon günleri arasında gizlice alıyorum.
MageProspero

Herhangi bir q elementinin içinde boşluklar varsa, bu onu çoklu elementlere böler.
William Everett
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.