খোল
উচ্চ স্তরের ভাষা লোড করতে সময় লাগে।
কয়েকটি লাইনের জন্য, শেল নিজেই একটি সমাধান হতে পারে।
আমরা বাইরের কমান্ড sort
এবং কমান্ডটি ব্যবহার করতে পারি tr
। একটি লাইন বাছাইয়ে যথেষ্ট দক্ষ এবং অন্যটি একটি ডিলিমিটারকে নতুন লাইনে রূপান্তর করতে কার্যকর:
#!/bin/bash
shsort(){
while IFS='' read -r line; do
echo "$line" | tr "$1" '\n' |
sort -n | paste -sd "$1" -
done <<<"$2"
}
shsort ' ' '10 50 23 42'
shsort '.' '10.1.200.42'
shsort ',' '1,100,330,42'
shsort '|' '400|500|404'
shsort ',' '3 b,2 x,45 f,*,8jk'
shsort '.' '10.128.33.6
128.17.71.3
44.32.63.1'
এটি <<<
কেবলমাত্র ব্যবহারের কারণে বাশ দরকার । যদি এটি এখানে-ডক দিয়ে প্রতিস্থাপন করা হয় তবে সমাধানটি পিক্সির জন্য বৈধ।
এই ট্যাব, স্পেস বা শেল উল্লিখিত glob অক্ষর ক্ষেত্র বাছাই করতে সক্ষম হয় ( *
, ?
, [
)। নতুন লাইন নয় কারণ প্রতিটি লাইন বাছাই করা হচ্ছে।
ফাইলের নামগুলি প্রক্রিয়া <<<"$2"
করতে পরিবর্তন করুন <"$2"
এবং এটিকে কল করুন:
shsort '.' infile
ডিলিমিটার পুরো ফাইলের জন্য একই। যদি এটি সীমাবদ্ধতা হয় তবে এটি উন্নত হতে পারে।
তবে মাত্র 6000 লাইন সহ একটি ফাইল প্রক্রিয়া করতে 15 সেকেন্ড সময় নেয়। সত্যিই, ফাইলগুলি প্রক্রিয়া করার জন্য শেলটি সেরা সরঞ্জাম নয়।
awk
কয়েকটি লাইনের বেশি (কয়েক দশকের বেশি) এর জন্য একটি আসল প্রোগ্রামিং ভাষা ব্যবহার করা ভাল। একটি বিশুদ্ধ সমাধান হতে পারে:
#!/bin/bash
awksort(){
gawk -v del="$1" '{
split($0, fields, del)
l=asort(fields)
for(i=1;i<=l;i++){
printf( "%s%s" , (i==0)?"":del , fields[i] )
}
printf "\n"
}' <"$2"
}
awksort '.' infile
যা উপরে উল্লিখিত একই 6000 লাইনের ফাইলের জন্য কেবল 0.2 সেকেন্ড সময় নেয়।
বুঝতে হবে যে <"$2"
ফাইলগুলির <<<"$2"
জন্য শেল ভেরিয়েবলের অভ্যন্তরে রেখার জন্য আবার পরিবর্তন করা যেতে পারে ।
পার্ল
দ্রুততম সমাধান পার্ল।
#!/bin/bash
perlsort(){ perl -lp -e '$_=join("'"$1"'",sort {$a <=> $b} split(/['"$1"']/))' <<<"$2"; }
perlsort ' ' '10 50 23 42'
perlsort '.' '10.1.200.42'
perlsort ',' '1,100,330,42'
perlsort '|' '400|500|404'
perlsort ',' '3 b,2 x,45 f,*,8jk'
perlsort '.' '10.128.33.6
128.17.71.3
44.32.63.1'
আপনি যদি ফাইলের পরিবর্তনটিকে <<<"$a"
সহজেই বাছাই করতে চান "$a"
এবং -i
ফাইল সংস্করণটিকে "জায়গায়" রাখার জন্য পার্ল বিকল্পগুলিতে যুক্ত করতে চান:
#!/bin/bash
perlsort(){ perl -lpi -e '$_=join("'"$1"'",sort {$a <=> $b} split(/['"$1"']/))' "$2"; }
perlsort '.' infile; exit