बैश में, उन में संख्याओं के साथ तार कैसे सॉर्ट करें?


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, निम्नलिखित के साथ कुछ के साथ pdfs को जोड़ना है

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

अर्थात्, फ़ील्ड विभाजक (-th) के रूप में 'h' का उपयोग करके दूसरे फ़ील्ड (-k2) पर संख्यात्मक रूप से (-n) सॉर्ट करें।


एक क्षेत्र में विभाजित करना और फिर छंटनी - यह एक शानदार टिप है जो मुझे यकीन है कि भविष्य में आसान होगी, धन्यवाद।
11

6

आप -vGNU में विकल्प का उपयोग कर सकते हैं ls: पाठ के भीतर (संस्करण) संख्याओं का प्राकृतिक प्रकार।

ls -1v cwcch*

यह बीएसडी ls(जैसे ओएस एक्स पर) के साथ काम नहीं करता है , जहां -vविकल्प का एक अलग अर्थ है।


यह सबसे सरल उपाय है, इसे और अधिक लोगों की आवश्यकता है!
davidparks21

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

या आप एक अलग दृष्टिकोण की कोशिश कर सकते हैं। जब मुझे ऐसा कुछ करने की आवश्यकता होती है, तो मैं आमतौर पर समय से पहले अपने नंबरों को ठीक से फॉर्मेट करने की कोशिश करता हूं। अगर मैं इसमें देरी से आ रहा हूँ और 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 का उपयोग करता है । फिर यह इन नंबरों को sed को फीड करता है और उन्हें प्लग इन करता है। फिर uniq के साथ डुप्लिकेट के आउटपुट को छापता है।


यूनीक के स्थान पर, आप awk का उपयोग कर सकते हैं:

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फ़ाइल पर काम करता है? उत्तर में पेस्ट करने के लिए कोई आउटपुट?
1720 पर Xen2050

हाँ। मैंने अपने सेक्शन में आउटपुट को एडिट सेक्शन के तहत शामिल किया।
अगुएवारा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.