Negativeণাত্মক সংখ্যা সহ ফাইলগুলিকে সংখ্যায় বাছাই করা


0

আমার কাছে একগুচ্ছ ফাইল রয়েছে:

adenine-N1_B+1,70_A+0,00.pdb
adenine-N1_B+1,70_A-10,00.pdb
adenine-N1_B+1,70_A+10,00.pdb
adenine-N1_B+1,70_A-15,00.pdb
adenine-N1_B+1,70_A+15,00.pdb
adenine-N1_B+1,70_A-20,00.pdb
adenine-N1_B+1,70_A+20,00.pdb
adenine-N1_B+1,70_A-25,00.pdb
adenine-N1_B+1,70_A+25,00.pdb
adenine-N1_B+1,70_A-30,00.pdb
adenine-N1_B+1,70_A+30,00.pdb
adenine-N1_B+1,70_A-5,00.pdb
adenine-N1_B+1,70_A+5,00.pdb

নিম্নলিখিতগুলি পেতে আমি সংখ্যায় বাছাই করতে চাই:

adenine-N1_B+1,70_A-30,00.pdb
adenine-N1_B+1,70_A-25,00.pdb
adenine-N1_B+1,70_A-20,00.pdb
adenine-N1_B+1,70_A-15,00.pdb
adenine-N1_B+1,70_A-10,00.pdb
adenine-N1_B+1,70_A-5,00.pdb
adenine-N1_B+1,70_A+0,00.pdb
adenine-N1_B+1,70_A+5,00.pdb
adenine-N1_B+1,70_A+10,00.pdb
adenine-N1_B+1,70_A+15,00.pdb
adenine-N1_B+1,70_A+20,00.pdb
adenine-N1_B+1,70_A+25,00.pdb
adenine-N1_B+1,70_A+30,00.pdb

এটি করার জন্য কি কোনও বাছাই আদেশ আছে? এখনও পর্যন্ত, আমি নিম্নলিখিত:

for i in $(ls *.pdb | sort -V); do echo $i; done

উত্তর:


0

TL; ড

ls *.pdb | sort -k 1.20g

(হ্যাঁ, আমি এটি এবং আরও জানি ; নীচে ক্ষতি বিভাগগুলি দেখুন)।


বাছাইয়ের যুক্তি

একটি সাধারণ সংখ্যা বাছাই ( sort -g) হ'ল যা আপনি চান তবে আপনার সংখ্যা নির্দিষ্ট করা উচিত।

আপনার উদাহরণগুলি ফর্মের:

adenine-N1_B+1,70_A-15,00.pdb
                   ^ the number starts here: character 20, always

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

sort -k 1.20g

আপনি এটি আরও জটিল যুক্তি পরিচয় করিয়ে দিতে পারেন। উদাহরণস্বরূপ, এন্ট্রিগুলির মধ্যে যদি কোনও একটি হয় bogonine-X3_B+1,00_A-12,00.pdb, তবে এ জাতীয় প্রবেশদ্বারগুলি পচে যাওয়া যথেষ্ট বুদ্ধিমান হবে:

foo_bar_A+00,00.pdb
   ^   ^ field separators
^ first field starts here
        ^ third field starts here
         ^ the number starts here: field 3, character 2

এবং প্রথম ক্ষেত্র অনুসারে বাছাই (উদাঃ), তারপর এই সংখ্যার সাহায্যে:

sort -t '_' -k 1,1 -k 3.2g

( এই উত্তরটির তুলনা করুন )।


স্থান

পরিবেশ দ্বারা নির্দিষ্ট লোকেল বাছাইয়ের ক্রমকে প্রভাবিত করে। এক্ষেত্রে LC_ALL=Cঠিক করার জন্য পরামর্শের মুখোমুখি হতে পারে । আপনি শেষ কমা ( ,)) দশমিক বিভাজক হিসাবে বিবেচনা করতে চান কিনা তার উপর নির্ভর করে এটি হতে পারে বা নাও হতে পারে (ভাল, আপনার ,00প্রতিটি প্রবেশিকায় রয়েছে, সুতরাং এটি সত্যিকার অর্থে গুরুত্বপূর্ণ নয়; তবে এটি গুরুত্বপূর্ণ বিষয় নয়) সাধারণ).

আপনার যদি কেবল একটি নির্দিষ্ট অনুরোধের জন্য লোকেলটি পরিবর্তন করতে sortহয় তবে এই উপায়:

LC_ALL=C sort 

বিভিন্ন পদ্ধতির ক্ষতি

এটি আপনি চেষ্টা করেছেন:

for i in $(ls *.pdb | sort -V); do echo $i; done

কমান্ড অত্যধিক জটিল, অভ্যন্তরীণ অংশটি একইভাবে একই কাজ করে:

ls *.pdb | sort -V

আউটপুট পার্সিং lsহয় একটি ভাল ধারণা না তাই আপনি এটি দিয়ে পার পেতে হবে, যদিও আপনার উদাহরণ ফাইলের নামের বেশ নিরাপদ। আপনার কোনও প্রয়োজন নেই তা নোট করুন ls:

for i in *.pdb; do echo "$i"; done | sort 

সমস্যাটি ls *.pdbহ'ল আপনি argument list too longত্রুটিটি আঘাত করতে পারেন (ভাল, আপনার উদাহরণের ক্ষেত্রে নয়, তবে আবার: সাধারণভাবে)। বাক্য গঠন for i in *.pdb; …প্রতিরোধ ক্ষমতা।

আপনার উদাহরণগুলির নামগুলি echoপাশাপাশি ব্যবহার করা নিরাপদ বলে মনে হচ্ছে (এর সাথে সাধারণ সমস্যাটি দেখুনecho )। এগুলিতে বিশেষ অক্ষর নেই যাতে আপনার প্রয়োজনও হয় find … -print0না sort -z …ইত্যাদি etc.

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