আমি কীভাবে একটি অ্যারের থেকে কোনও উপাদান পুরোপুরি সরিয়ে ফেলতে পারি?


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
না, স্পেসগুলি সমস্যার কারণ নয়, তবে উদ্ধৃতিগুলির অভাব রয়েছে।
18:33

উত্তর:


68

কেবলমাত্র অ্যাসাইনমেন্টে অ্যারে সিনট্যাক্স ব্যবহার করুন এবং আপনার ভেরিয়েবলের উদ্ধৃতি দিন:

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

মন্তব্য মতামত অনুযায়ী সম্পাদনা করুন। জন্য $@আপনি এটা ভালো ব্যবহার করতে পারেন:

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

8
নোট করুন যে এটি 1 ম এলিমেন্টটি সরিয়ে দেয় না তবে ইন্ডিস 0 এর উপাদান এবং সূচকগুলি পুনরায় সাইন করে। প্রথম উপাদানটি যদি ইনডিস 12 তে থাকে তবে এটি কিছুই সরিয়ে ফেলবে না তবে সূচকগুলি পুনরায় নিয়োগ করবে যাতে একসময় যা ছিল 12 বার ইনডিসে ছিল এখন তা ইনডিসে থাকবে 0. এটি সম্ভবত ওপি-র ক্ষেত্রে উদ্বেগ নয় তবে সম্ভবত এটি লক্ষ করা উচিত ভবিষ্যতে উল্লেখের. zshযার অ্যারেগুলি ksh বা বাশের বিপরীতে বিচ্ছিন্ন নয় এর সাথে আচরণটি আলাদা ।
স্টাফেন চেজেলাস

3
হাই @ স্টাফেনচাজেলাস "সূচকের" একবাক্য হ'ল " সূচক "। আপনার মন্তব্যের জন্য ধন্যবাদ!
স্টিভেন লু

3
@ মান্যাটওয়ার্ক - পুনরায়: আপনার সম্পাদনা - কেন ব্যবহার হচ্ছে না shift?
don_crissti

1
@ ডন_ক্রিসটি, ভালো কথা। আমি সূচকের পার্থক্যে মনোনিবেশ করেছি এবং আরও ভাবি না আপনি যখন পরিবর্তনশীল পরিমাণের আইটেমগুলি ত্যাগ করতে প্রয়োজন তখন পরিস্থিতিটিও মনে রেখেছিল, উদাহরণস্বরূপ সর্বশেষ 3: array=("${array[@]: -3}")এবং set -- "${@: -3}"। সূচকগুলিতে তাই আটকে গেল।
manatwork

1
shift $[$#-3]শেষ 3 এর জন্য সম্ভবত এটি খুব দ্রুত$@
টিনো

0

এই আমার চিন্তা ছিল। সেড / অ্যাজক / লেজযুক্ত সমস্যাটি হ'ল তারা লাইন পরস্পর লাইনে রয়েছে। আপনি প্রথম লাইনটি মুছে ফেলার পরে আপনাকে ফাইলের জন্য প্যাটার্ন স্পেস থেকে অন্য প্রতিটি লাইন লিখতে হবে।

  • আপনি সেকেন্ডে যা চান তা করতে নিম্নলিখিত কমান্ডগুলি ব্যবহার করতে পারেন।
  • এটি একটি অ্যারেতে পুরো ফাইলটি লিখবে।
  • প্রথম লাইনে এটি ফাইলের মধ্যে ফেলার সময় সরিয়ে ফেলুন।

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

largefileআপনার ফাইলের নামটি পরিবর্তন করুন।


sed -i 1d largefileপরিবর্তে ব্যবহার করবেন না কেন ? এটি এমনকি র‌্যাম + স্ব্যাপের চেয়ে বড় ফাইলগুলির জন্য কাজ করে
টিনো

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
এটি কেবল কোডের একটি ব্লব না হয়ে কীভাবে এটি কাজ করে তা বোঝানোর মতো কিছু থাকলে এটি আরও ভাল। এবং নীচে tildes সঙ্গে কি?
একটি সিভিএন

3
সিরিয়াসলি, আপনি সঠিক। এটি দেখে মনে হচ্ছে এটি কোনও গুন্ডা লিখেছিল, তবে আপনাকে ধন্যবাদ। আমি সত্যিই কেবল হ্যামবার্গার পরিবেশনকারী দিনের মধ্যে এটি লুকিয়ে থাকতে পারি।
MageProspero

যদি q এর যে কোনও উপাদানটির মধ্যে ফাঁকা স্থান থাকে, এটি এটি একাধিক উপাদানগুলিতে বিভক্ত করবে।
উইলিয়াম এভারেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.