আমি কীভাবে মেজর.মিনোর.প্যাচ স্তর এবং কখনও কখনও সঠিকভাবে আরসি দিয়ে একটি তালিকা সাজিয়ে রাখতে পারি?


18

আমাকে নীচের তালিকাটি শেল স্ক্রিপ্টের সাথে বাছাই করতে হবে এবং সর্বশেষতম সংস্করণটি নীচে বা উপরে প্রদর্শিত করতে হবে। আমি কেবল শেল সরঞ্জাম দিয়ে কীভাবে এটি করব?

release-5.0.0.rc1
release-5.0.0.rc2
release-5.0.0
release-5.0.1
release-5.0.10
release-5.0.11
release-5.0.13
release-5.0.14
release-5.0.15
release-5.0.16
release-5.0.17
release-5.0.18
release-5.0.19
release-5.0.2
release-5.0.20
release-5.0.21
release-5.0.22
release-5.0.23
release-5.0.24
release-5.0.25
release-5.0.26
release-5.0.27
release-5.0.28
release-5.0.29
release-5.0.3

1
আরও দেখুন printf '%s\n' ${(on)array}মধ্যে zsh। (যখন তালিকাটি $arrayঅ্যারেতে থাকবে)।
স্টাফেন চেজেলাস

উত্তর:


20

জিএনইউ সাজ্টে -Vবেশিরভাগ ক্ষেত্রে ( বিশদ ) এর মতো একটি তালিকা মোকাবেলা করতে পারে :

 -V, --version-sort
        natural sort of (version) numbers within text

$ cat vers
release-5.0.19
release-5.0.19~pre1
release-5.0.19-bigbugfix
release-5.0.2
release-5.0.20
$ sort -V vers
release-5.0.2
release-5.0.19~pre1
release-5.0.19
release-5.0.19-bigbugfix
release-5.0.20

যাইহোক, এই .rc*সংস্করণগুলি কিছুটা সমস্যা হতে পারে, যেহেতু সম্ভবত এটি সম্পর্কিত নন-আরসি সংস্করণের আগেই বাছাই করা উচিত , যদি উভয়ই ঘটে থাকে তবে তা। কিছু সংস্করণ সিস্টেম (যেমন ডেবিয়ান), ~প্রাক-প্রকাশগুলি চিহ্নিত করতে টিলড ( ) দিয়ে শুরু হওয়া প্রত্যয় ব্যবহার করে এবং এগুলি প্রত্যয় ছাড়াই সংস্করণের আগে সাজিয়ে তোলে যা অন্যান্য প্রত্যয় সহ সংস্করণের আগে সাজায়। আপাতদৃষ্টিতে sortএটি আমার সিস্টেমে অন্ততপক্ষে সমর্থন করে , যেমন উপরে দেখানো হয়েছে ( sort (GNU coreutils) 8.23)।


3
কয়েক সেকেন্ডের মধ্যে আমাকে স্নিপ করেছেন :)
রসুয়াভ

1
অনেক ধন্যবাদ. এমনকি কল্পনাও করেননি যে এই ধরণের একটি বিকল্প আছে।
ম্যান্ড্রাগোর

এফডাব্লুআইডাব্লু, ওপেনবিএসডি-তে -Vডিফল্টরূপে সমর্থিত sort, তবে নেটবিএসডি তে নয়।
কুসালানন্দ

ফ্রিবিএসডিও, স্পষ্টতই , সেখানকার ম্যান পেজটিতে একটি উদাহরণ আউটপুট ক্রম রয়েছে এবং এটি ওপেনবিএসডি-র সাথে অভিন্ন দেখায়।
ইল্কাচ্চু

7

চেক আউট sort -V:

   -V, --version-sort
          natural sort of (version) numbers within text

সংস্করণ সংখ্যাগুলি হ'ল বর্ণমালার অংশ পরিচালিত খুব কম মান সহ জটিল জন্তু, তবে এটি আপনার আসল ডেটাতে চেষ্টা করে দেখুন এটি যথেষ্ট কিনা।


বাহ, দুর্দান্ত! এটি ফাইলের নাম সহ আমার পুরানো সমস্যার জন্যও কাজ করে mayorNumber–minorNumer some text, যেখানে ইউনিকোড ডিলিমিটারের কারণে ফিল্ড বাছাই করতে ব্যর্থ হয়। ইঙ্গিত দেওয়ার জন্য আপনাকে ধন্যবাদ!
ফিলিপস

3

এটি এক লাইন হিসাবে করা যেতে পারে, তবে পাঠযোগ্যতার জন্য এখানে একাধিক লাইনে (পাইপগুলিতে) বিভক্ত হয়ে যায় এবং এটিরও পরিচালনা করে rc

-Vআপনার বাছাইয়ের জন্য যদি বিকল্প না থাকে বা আপনি তা করেন তবে আপনার মাঝে মাঝে এর মোকাবেলা করতে হবে rc:

cat versionlist |
sed -e "s/release-//" -e "s/rc//" |
sort -t. -n -k1,1 -k2,2 -k3,3 -k4,4 |
sed -r -e "s/([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)/\1.\2.\3.rc\4/" -e "s/^/release-/"

প্রথম sedরেখাচিত্রমালা অ সাংখ্যিক বর্ণ ব্যবহারের একটি বিভেদক ( ), সাংখ্যিক সাজানোর (- ), এবং কি-সংকলন ( ) চূড়ান্ত রাখে অ সাংখ্যিক বর্ণ ফিরে জায়গায়।
sort.-t.n-k
sed


0

সমস্ত অনুপ্রেরণার জন্য ধন্যবাদ - আমি আমার নিজের উত্তর প্রস্তাব করতে পারি: বাছাই করা প্রোগ্রাম যা প্রয়োজন তা করার জন্য চালিত করা যেতে পারে। শেষ পর্যন্ত এটি 3 ডিজিটের সংস্করণে চতুর্থ সংখ্যা যুক্ত করার বিষয়ে, এটিকে বাছাই করুন এবং তারপরে আবার সরিয়ে ফেলুন। কাজ করে - এখন পর্যন্ত সরল সমাধান, আইএমএইচও।

cat versionlist |\
sed -r "s/([0-9]+\.[0-9]+\.[0-9]+$)/\1\.99999/"|sort -V|sed s/\.99999$//

ফলাফল:

release-5.0.0.rc1
release-5.0.0.rc2
release-5.0.0

....

0
$ cat /tmp/tmp.tmp
release-5.0.0.rc1
release-5.0.0.rc2
release-5.0.0
release-5.0.1
release-5.0.10
release-5.0.11
release-5.0.13
release-5.0.14
release-5.0.15
release-5.0.16
release-5.0.17
release-5.0.18
release-5.0.19
release-5.0.2
release-5.0.20
release-5.0.21
release-5.0.22
release-5.0.23
release-5.0.24
release-5.0.25
release-5.0.26
release-5.0.27
release-5.0.28
release-5.0.29
release-5.0.3

$ cat /tmp/tmp.tmp | awk -F\- '{ print $2,$1 }' | sort -n | awk '{ print $2 "-" $1 }'
release-5.0.0
release-5.0.0.rc1
release-5.0.0.rc2
release-5.0.1
release-5.0.10
release-5.0.11
release-5.0.13
release-5.0.14
release-5.0.15
release-5.0.16
release-5.0.17
release-5.0.18
release-5.0.19
release-5.0.2
release-5.0.20
release-5.0.21
release-5.0.22
release-5.0.23
release-5.0.24
release-5.0.25
release-5.0.26
release-5.0.27
release-5.0.28
release-5.0.29
release-5.0.3

$

রিলিজ -5.0.0 তালিকার পরে .rc1 এবং .rc2 পরে আসা উচিত। এটাই এখানে চ্যালেঞ্জ।
মান্দ্রাগোর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.