বাশ স্ক্রিপ্ট ব্যবহার করে স্ট্রিং + সংখ্যার সাথে মিলিত স্ট্রিংটি কীভাবে সাজানো যায়?


27

এই তথ্যটি আমি কী বাছাই করতে চাই। তবে sortসংখ্যার সাথে স্ট্রিংয়ের সাথে আচরণ করে, এটি আমার প্রত্যাশার মতো ডেটা সাজানো হয়নি।

/ হোম / ফাইল / প্রোফাইল 1
/ হোম / ফাইল / প্রোফাইল 10
/ হোম / ফাইল / প্রোফাইল 11
/ হোম / ফাইলস / প্রোফাইল 12
/ হোম / ফাইল / প্রোফাইল 14
/ হোম / ফাইল / প্রোফাইল 15
/ হোম / ফাইলস / প্রোফাইল 16
/ হোম / ফাইল / প্রোফাইল 2
/ হোম / ফাইল / প্রোফাইল3
/ হোম / ফাইল / প্রোফাইল 4
/ হোম / ফাইল / প্রোফাইল 5
/ হোম / ফাইল / প্রোফাইল 6
/ হোম / ফাইল / প্রোফাইল 7
/ হোম / ফাইল / প্রোফাইল 8
/ হোম / ফাইল / প্রোফাইল 9

আমি এটিকে বাছাই করতে চাই,

/ হোম / ফাইল / profile1
/ হোম / ফাইল / PROFILE2
/ হোম / ফাইল / profile3
/ হোম / ফাইল / profile4
/ হোম / ফাইল / profile5
/ হোম / ফাইল / profile6
/ হোম / ফাইল / profile7
/ হোম / ফাইল / profile8
/ হোম / ফাইল / profile9
/ হোম / ফাইল / profile10
/ হোম / ফাইল / profile11
/ হোম / ফাইল / profile12
/ হোম / ফাইল / profile14
/ হোম / ফাইল / profile15
/ হোম / ফাইল / profile16

বাশ স্ক্রিপ্টের মাধ্যমে কি কোনও ভাল উপায় আছে? আমি এখানে রুবি বা পাইথন স্ক্রিপ্ট ব্যবহার করতে পারি না।


"সাজানোর -আর" ব্যবহার করার চেষ্টা করুন
বোবাহ

1
@ বোবাহ, "সাজান: বিকল্পগুলি` -dn 'বেমানান "
ম্যাক্সচলেপজিগ

10
sort -Vকরতে হবে.
থোর

2
@থর. আপনার মন্তব্য একটি ভাল উত্তর দিতে হবে
পিটার.ও

উত্তর:


21

সংখ্যাটি সীমাবদ্ধ করতে আপনি একটি অস্থায়ী সেন্ডিনেল চরিত্রটি ব্যবহার করতে পারেন:

$ sed 's/\([0-9]\)/;\1/' log | sort -n -t\; -k2,2 | tr -d ';'

এখানে প্রেরিত চরিত্রটি ';' - এটি আপনার বাছাই করা যে কোনও ফাইলের নামের অংশ নয় but তবে আপনি ';' বিনিময় করতে পারেন; আপনার পছন্দ মতো কোনও চরিত্রের সাথে। আপনাকে সেই পরিবর্তন করতে হবে sed, sortএবং trতারপরে অংশটি।

পাইপটি নিম্নরূপে কাজ করে: sedকমান্ডটি কোনও সংখ্যার আগে সেন্ডিনেল সন্নিবেশ করায়, sortকমান্ডটি সেন্ডিনেলটিকে ক্ষেত্রের ডিলিমিটার হিসাবে ব্যাখ্যা করে, দ্বিতীয় ক্ষেত্রের সাথে সাংখ্যিক বাছাই কী হিসাবে সাজায় এবং trকমান্ডটি সেন্ডিনেলটিকে আবার সরিয়ে দেয়।

এবং logইনপুট ফাইলকে বোঝায় - আপনি নিজের ইনপুটটি পাইপও করতে পারেন sed


আপনি যেভাবে সমস্যার সমাধান করেছেন তা আমি পছন্দ করি :)
SHW

44

এটি এই প্রশ্নের সাথে খুব মিল । সমস্যাটি হ'ল এমন একটি আলফানিউমারিক ফিল্ড রয়েছে যার উপর আপনি বাছাই করছেন এবং সংবেদনশীলভাবে -nএটি ব্যবহার করেন না, তবে সংস্করণটি ( -V) দেয়। এইভাবে ব্যবহার করুন:

sort -V

নোট করুন যে এই বৈশিষ্ট্যটি বর্তমানে জিএনইউ, ফ্রিবিএসডি এবং ওপেনবিএসডি সাজানোর বাস্তবায়ন দ্বারা সমর্থিত।


আপনি জানেন কি এটি বহনযোগ্য? এই বিকল্পটি পসিক্স স্পেকের অংশ বলে মনে হচ্ছে না।
আর্নেস্ট এ

@ আর্নেস্তা: আপনি ঠিক বলেছেন, এটি জিএনইউ সাজানোর নির্দিষ্ট সমাধান। একটি নোট যুক্ত।
থোর

@ আর্নেস্তা: আমার মনে হচ্ছে ফ্রিবিএসডি এবং ওপেনবিএসডি এই বৈশিষ্ট্যটি যুক্ত করেছে।
থোর

সংখ্যাগুলির বিভিন্ন উপসর্গ থাকলে এটি কাজ করে না।
দান্তে

1
যে কোনও পাঠকের কাছে: নোট করুন এটি একটি বড় ভি! ব্যবহার করবেন sort -Vনা sort -v। এটি প্রথম নজরে বলা শক্ত।
গ্যাব্রিয়েল স্টেপলস

7

যদি আপনার সমস্ত ফাইলের নামের চূড়ান্ত সংখ্যাসূচক অংশের আগে একই উপসর্গ থাকে, বাছাইয়ের সময় এটিকে উপেক্ষা করুন:

sort -k 1.20n

(২০ টি প্রথম অঙ্কের অবস্থান It's এটি দৈর্ঘ্যের এক প্লাস /home/files/profile)

আপনার যদি বেশ কয়েকটি ভিন্ন অ-সংখ্যাযুক্ত অংশ থাকে তবে একটি সেন্ডিনেল inোকান

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