একটি সমাধান - এটি যে * আরএস ভেরিয়েবলগুলি পরিবর্তন করে তাদের মত মার্জিত নয়, তবে সম্ভবত যুক্তিযুক্তভাবে পরিষ্কার:
PATH=`awk 'BEGIN {np="";split(ENVIRON["PATH"],p,":"); for(x=0;x<length(p);x++) { pe=p[x]; if(e[pe] != "") continue; e[pe] = pe; if(np != "") np=np ":"; np=np pe}} END { print np }' /dev/null`
পুরো প্রোগ্রামটি বিগইন এবং এন্ড ব্লকগুলিতে কাজ করে। এটি পরিবেশ থেকে আপনার PATH ভেরিয়েবলটি টানছে, একে ইউনিটে বিভক্ত করে। এরপরে এটি ফলাফল অ্যারে পি (যা দ্বারা ক্রমে তৈরি করা হয় split()
) এর পুনরাবৃত্তি হয় । অ্যারে ই একটি সহযোগী অ্যারে যা আমরা বর্তমান পথের উপাদানটি (যেমন / usr / স্থানীয় / বিন ) এর আগে দেখেছি কিনা এবং তা নির্ধারণ করতে ব্যবহৃত হয় , এবং যদি না হয় তবে এনপি-তে সংযুক্ত করা হয়েছে , কোলনে যুক্ত করার যুক্তি যুক্ত রয়েছে NP যদি ইতিমধ্যেই লেখা NP । END টি ব্লক কেবল এত প্রতিধ্বনি NP । যোগ করে এটি আরও সরল করা যেতে পারে-F:
পতাকা, তৃতীয় যুক্তি দূর split()
(যেমন ডিফল্ট ফাঃ ), এবং পরিবর্তন np = np ":"
করার জন্য np = np FS
, আমাদের দান:
awk -F: 'BEGIN {np="";split(ENVIRON["PATH"],p); for(x=0;x<length(p);x++) { pe=p[x]; if(e[pe] != "") continue; e[pe] = pe; if(np != "") np=np FS; np=np pe}} END { print np }' /dev/null
অবশ্যই, আমি বিশ্বাস করি যে এটি for(element in array)
অর্ডার সংরক্ষণ করবে, কিন্তু এটি কার্যকর হয় না, সুতরাং আমার আসল সমাধানটি কাজ করে না, কারণ হঠাৎ যদি কেউ তাদের ক্রমটি ভ্রষ্ট করে দেয় তবে লোকেরা বিচলিত হবে $PATH
:
awk 'BEGIN {np="";split(ENVIRON["PATH"],p,":"); for(x in p) { pe=p[x]; if(e[pe] != "") continue; e[pe] = pe; if(np != "") np=np ":"; np=np pe}} END { print np }' /dev/null