मैं किसी तत्व को किसी सरणी से पूरी तरह कैसे निकाल सकता हूं?


48

unset array[0]तत्व को निकालता है, लेकिन फिर भी अगर मुझे कुछ अधिक echo ${array[0]}मूल्य मिलता है, तो ऐसा करने के अन्य तरीके हैं, लेकिन अगर किसी सरणी के तत्व में नीचे जैसे स्थान हैं

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)

4
नहीं, रिक्त स्थान परेशानी का कारण नहीं है, लेकिन उद्धरण की कमी है।
मैनेटवर्क

जवाबों:


68

बस असाइनमेंट पर सरणी सिंटैक्स का उपयोग करें और अपने चर को उद्धृत करें:

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

टिप्पणी में प्रश्न के अनुसार संपादित करें । के लिए $@आप इसे इस प्रकार उपयोग कर सकते हैं:

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

8
ध्यान दें कि यह 1 तत्व को नहीं हटाता है, लेकिन संकेत 0 का तत्व और सूचकांकों को पुन: असाइन करता है। यदि पहला तत्व इंडिस 12 पर था, तो यह कुछ भी नहीं हटाएगा, लेकिन सूचकांकों को फिर से असाइन करेगा ताकि जो एक बार इंडिस 12 पर था वह अब इंडिस पर होगा। यह ओपी के मामले में शायद एक चिंता का विषय नहीं है, लेकिन शायद इसके लिए ध्यान दिया जाना चाहिए भविष्य के सन्दर्भ। व्यवहार भिन्न होता है, zshजिसकी सरणियाँ ksh या bash के विपरीत नहीं होती हैं।
स्टीफन चेज़लस

3
हाय @StephaneChazelas। "सूचकांक" का एकवचन " सूचकांक " है। आपके कमेंट के लिए धन्यवाद!
स्टीवन लू

3
@manatwork - re: आपका संपादन - क्यों नहीं उपयोग कर रहा है shift?
don_crissti

1
@don_crissti, अच्छी बात है। मैंने अनुक्रमण अंतर पर ध्यान केंद्रित किया और आगे नहीं सोचा। इसके अलावा उस स्थिति को ध्यान में रखें जब आपको वस्तुओं की परिवर्तनीय राशि को त्यागने की आवश्यकता होती है, उदाहरण के लिए अंतिम 3: array=("${array[@]: -3}")और set -- "${@: -3}"। तो सूचकांक पर अटक गया।
मैनटवर्क

1
shift $[$#-3]पिछले 3 के लिए शायद बहुत तेज है$@
Tino

0

यह मेरी सोच थी। Sed / awk / tail के साथ समस्या यह है कि वे लाइन से लाइन हैं। पहली पंक्ति को हटाने के बाद आपको हर दूसरी पंक्ति को पैटर्न स्पेस से फाइल में लिखना होगा।

  • आप सेकंड में क्या चाहते हैं, यह करने के लिए आप निम्न कमांड्स का उपयोग कर सकते हैं।
  • यह पूरी फाइल को एक अरै में लिख देगा।
  • पहली पंक्ति को हटा दें क्योंकि यह फ़ाइल में वापस जाती है।

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

बस largefileअपनी फ़ाइल का नाम बदलें ।


sed -i 1d largefileइसके बजाय उपयोग क्यों नहीं ? यह भी RAM से बड़ी फ़ाइलों के लिए काम करता है + स्वैप
Tino

0

किसी विशेष सूचकांक में एक तत्व को निकालने के लिए, हम उपयोग कर सकते हैं unsetऔर फिर दूसरे सरणी में कॉपी कर सकते हैं । केवल unsetइस मामले में आवश्यक नहीं है। क्योंकि unsetयह तत्व को नहीं हटाता है यह सिर्फ अशक्त स्ट्रिंग को विशेष सूचकांक में सरणी में सेट करता है।

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

-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
यह बहुत बेहतर होगा यदि यह समझाने के लिए कुछ है कि यह कैसे काम करता है और कोड की एक बूँद नहीं है। और तल पर टिल्ड्स के साथ क्या है?
बजे एक CVn

3
गंभीरता से, आप सही हैं। ऐसा लगता है कि यह एक गुंडे द्वारा लिखा गया था, लेकिन धन्यवाद। मैं वास्तव में हैमबर्गर सेवारत दिनों के बीच ही इसे चुपके से प्राप्त करता हूं।
MageProspero

यदि q के किसी भी तत्व में रिक्त स्थान है, तो यह इसे कई तत्वों में तोड़ देगा।
विलियम एवरेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.