আপনি যদি বাশ সংস্করণ 4 বা ততোধিক চলমান করেন (যা লিনাক্সের কোনও আধুনিক সংস্করণে হওয়া উচিত) তবে আপনি মূল অ্যারের প্রতিটি মান সমন্বিত একটি নতুন এসোসিয়েটিভ অ্যারে তৈরি করে ব্যাশে অনন্য অ্যারে মান পেতে পারেন। এটার মতো কিছু:
$ a=(aa ac aa ad "ac ad")
$ declare -A b
$ for i in "${a[@]}"; do b["$i"]=1; done
$ printf '%s\n' "${!b[@]}"
ac ad
ac
aa
ad
এটি কাজ করে কারণ যে কোনও অ্যারে (সংঘবদ্ধ বা traditionalতিহ্যবাহী, কোনও ভাষায়), প্রতিটি কী কেবল একবার উপস্থিত হতে পারে। যখন for
লুপ দ্বিতীয় মান আসে aa
মধ্যে a[2]
, এটা মুছে ফেলা হয় b[aa]
, যা আসলে জন্য সেট করা হয় a[0]
।
নেটিভ ব্যাশ জিনিসগুলি পাইপ মত বাহ্যিক সরঞ্জাম ব্যবহার তুলনায় দ্রুততর হতে পারে sort
এবং uniq
, যদি আপনি awk, পাইথন, ইত্যাদি একটি অধিক শক্তিশালী ভাষা ব্যবহার যদিও বড় ডেটাসেট জন্য আপনাকে সম্ভবত ভাল পারফরম্যান্স দেখতে পাবেন
আপনি যদি আত্মবিশ্বাসী বোধ করেন তবে একাধিক যুক্তির জন্য এর ফর্ম্যাটটিকে পুনর্ব্যবহার করার ক্ষমতা for
ব্যবহার করে আপনি লুপটি এড়াতে পারবেন printf
, যদিও এটির প্রয়োজন মনে হচ্ছে eval
। (আপনি যদি ঠিক হয়ে থাকেন তবে এখনই পড়া বন্ধ করুন))
$ eval b=( $(printf ' ["%s"]=1' "${a[@]}") )
$ declare -p b
declare -A b=(["ac ad"]="1" [ac]="1" [aa]="1" [ad]="1" )
এই সমাধানটির প্রয়োজনীয় কারণটি eval
হ'ল শব্দ বিভাজনের আগে অ্যারের মানগুলি নির্ধারিত হয়। এর অর্থ হ'ল কমান্ড প্রতিস্থাপনের আউটপুট একক শব্দ হিসাবে বিবেচিত হয় কী = মান জোড়ার সেট না করে হয়।
এটি একটি সাব-শেল ব্যবহার করার সময় অ্যারের মানগুলি প্রক্রিয়া করতে এটি কেবল ব্যাশ বিল্টিন ব্যবহার করে। eval
একটি সমালোচিত চোখ দিয়ে আপনার ব্যবহার মূল্যায়ন নিশ্চিত হন । আপনি যদি 100% আত্মবিশ্বাসী না হন যে চ্পনার বা গ্লেন জ্যাকম্যান বা গ্রাইকাট আপনার কোডটিতে কোনও দোষ খুঁজে না পাবে, তবে পরিবর্তে লুপটি ব্যবহার করুন।
uniq=($(printf "%s\n" "${ids[@]}" | sort -u)); echo "${uniq[@]}"