ব্যাশে, কীভাবে তাদের সংখ্যার সাথে স্ট্রিংগুলি বাছাই করা যায়?


37

আমার যদি একটি ডিরেক্টরিতে এই ফাইলগুলি থাকে

cwcch10.pdf
cwcch11.pdf
cwcch12.pdf
cwcch13.pdf
cwcch14.pdf
cwcch15.pdf
cwcch16.pdf
cwcch17.pdf
cwcch18.pdf
cwcch1.pdf
cwcch2.pdf
cwcch3.pdf
cwcch4.pdf
cwcch5.pdf
cwcch6.pdf
cwcch7.pdf
cwcch8.pdf
cwcch9.pdf

আমি কীভাবে এগুলিকে বাশে তালিকাবদ্ধ করতে পারি যাতে তারা স্ট্রিংয়ের সংখ্যা অংশের উপর ভিত্তি করে আরোহণের সংখ্যাসূচক ক্রমে থাকে। সুতরাং ফলাফল অর্ডার cwcch1.pdf, cwcch2.pdf, ..., cwcch9.pdf, cwcch10.pdf, ইত্যাদি।

আমি শেষ পর্যন্ত যা করার চেষ্টা করছি তা হল pdftkনীচের মতো কিছু দিয়ে পিডিএফগুলি একত্রিত করা

pdftk `ls *.pdf | sort -n` cat output output.pdf

তবে আমার কাজ বাছাই করা ভুল হিসাবে এটি কাজ করে না।


এই সমস্ত দুর্দান্ত উত্তরের জন্য ধন্যবাদ। ইউনিক্সের মতো সর্বদা, এই বিড়ালটির ত্বকের বিভিন্ন বিভিন্ন দুর্দান্ত উপায় রয়েছে।
এনজিএম

উত্তর:


7

এর মতো কিছু আপনি যা চান তা করতে পারে, যদিও এটি কিছুটা ভিন্ন পদ্ধতির দরকার:

pdftk $(for n in {1..18}; do echo cwcch$n.pdf; done) cat output output.pdf

আহা, দুর্দান্ত অ্যাপ্রোচ! এটি সত্যিই আমি যা করি তা করে, ধন্যবাদ।
এনজিএম

62

আপনার sortপক্ষে এটি করার ক্ষমতা থাকতে পারে:

sort --version-sort

সাজানোর ম্যান পেজে প্রাসঙ্গিক এন্ট্রিটির অংশ: -V, --version-sort natural sort of (version) numbers within text
পানমারী

এই আপনার প্রয়োজন। কিন্তু আপনার সাজানোর এই অপশনটি সরবরাহ করে না যদি পোস্টটি কটাক্ষপাত করা stackoverflow.com/a/4495368/1240018
eventhorizon

30

এই বিশেষ উদাহরণের জন্য আপনি এটি করতে পারেন:

ls *.pdf | sort -k2 -th -n

এটি হ'ল ক্ষেত্র বিভাজক (-ম) হিসাবে 'এইচ' ব্যবহার করে দ্বিতীয় ক্ষেত্রের (-n2) সংখ্যায় (-n) বাছাই করুন।


বিভক্ত করা এবং তারপরে একটি ক্ষেত্র বাছাই করা - এটি একটি দুর্দান্ত টিপ যা আমি নিশ্চিত যে ভবিষ্যতে কার্যকর হবে, ধন্যবাদ।
এনজিএম

6

আপনি -vজিএনইউতে বিকল্পটি ব্যবহার করতে পারেন ls: পাঠ্যের মধ্যে প্রাকৃতিক সাজানো (সংস্করণ) সংখ্যা।

ls -1v cwcch*

এটি BSD ls(উদাহরণস্বরূপ ওএস এক্স) এর সাথে কাজ করে না , যেখানে -vবিকল্পটির আলাদা অর্থ রয়েছে।


এটি সবচেয়ে সহজ সমাধান, এটির জন্য আরও বেশি লোকের প্রয়োজন!
ডেভিডপর্ক 21

2

কমান্ডলাইনে সরাসরি শেল প্রসারণ ব্যবহার করুন। সম্প্রসারণ তাদের সঠিকভাবে অর্ডার করা উচিত। আমি যদি pdftkকমান্ডলাইন সিনট্যাক্সটি সঠিকভাবে বুঝতে পারি তবে এটি আপনি যা করতে তা করবে:

# shell expansion with square brackets
pdftk cwcch[1-9].pdf cwcch1[0-9].pdf cat output output.pdf

# shell expansion with curly braces
pdftk cwcch{{1..9},{10..18}}.pdf cat output output.pdf

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

# rename is rename.pl aka prename -- perl rename script
# this adds a leading zero to single-digit numbers
rename 's/(\d)/0$1/' cwcch[1-9].pdf

এখন স্ট্যান্ডার্ড lsবাছাই সঠিকভাবে কাজ করবে।


2
সম্ভবত আরও কিছুটা সংক্ষেপে:pdftk cwcch{{1..9},{10..18}}.pdf ...
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

ভাল টিপ, যোগ করা হয়েছে। এটি কি একটি স্ট্যান্ডার্ড বোর্ন শেল এক্সপেনশন সিনট্যাক্স বা bashএক্সটেনশন?
কোয়াকোট কোয়েসোট


0

সাজানো -g ব্যবহার করা হয় ক্রম সংখ্যা বাছাই করার জন্য।

anthony@mtt3:~$ sort --help | egrep "\-g"
-g, --general-numeric-sort  compare according to general numerical value


নীচের একটি লাইনার পিডিএফ ফাইলগুলির নাম সহ একটি ফাইলের উপরে পুনরাবৃত্তি করে এবং কেবলমাত্র egrep -o দিয়ে নম্বরগুলি আঁকড়ে এবং সংখ্যাটিকে আরোহণের ক্রম অনুসারে সাজানোর জন্য -g ব্যবহার করে । তারপরে এটি এই নম্বরগুলিকে সেড করার জন্য ফিড দেয় এবং এগুলিকে প্লাগ ইন করে Then


ইউনিকের জায়গায়, আপনি জোর করেও ব্যবহার করতে পারেন:

awk '!x[$0]++'

উপরেরটি ইউনিকের সমতুল্য।


আপনি যা খুঁজছেন তা হ'ল এই এক লাইনার:

for i in `cat tmp | egrep -o "[0-9]*" | sort -g`; do cat tmp | sed "s/\(^[a-z]*\)\([0-9]*\)\(\.pdf\)/\1$i\3/g" | uniq; done


Tmp এর উপাদানসমূহ:

anthony@mtt3:~$ cat tmp
cwcch10.pdf
cwcch11.pdf
cwcch12.pdf
cwcch13.pdf
cwcch14.pdf
cwcch15.pdf
cwcch16.pdf
cwcch17.pdf
cwcch18.pdf
cwcch1.pdf
cwcch2.pdf
cwcch3.pdf
cwcch4.pdf
cwcch5.pdf
cwcch6.pdf
cwcch7.pdf
cwcch8.pdf
cwcch9.pdf 

সম্পাদনা করুন:

কমান্ডের আউটপুট:

anthony@mtt3:~$ for i in `cat tmp | egrep -o "[0-9]*" | sort -g`; do cat tmp | sed "s/\(^[a-z]*\)\([0-9]*\)\(\.pdf\)/\1$i\3/g" | uniq; done

cwcch1.pdf
cwcch2.pdf
cwcch3.pdf
cwcch4.pdf
cwcch5.pdf
cwcch6.pdf
cwcch7.pdf
cwcch8.pdf
cwcch9.pdf
cwcch10.pdf
cwcch11.pdf
cwcch12.pdf
cwcch13.pdf
cwcch14.pdf
cwcch15.pdf
cwcch16.pdf
cwcch17.pdf
cwcch18.pdf

কি এই এক মাছ ধরার নৌকা কাজ tmpফাইল? উত্তর আটকানোর জন্য কোন আউটপুট?
Xen2050

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