ในทุบตีวิธีการเรียงสตริงด้วยตัวเลขในพวกเขา?


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

ฉันจะแสดงรายการพวกเขาใน Bash เพื่อให้พวกเขาอยู่ในลำดับตัวเลขจากน้อยไปมากขึ้นอยู่กับส่วนจำนวนของสตริง ดังนั้นผลลัพธ์ที่ได้คือcwcch1.pdf, cwcch2.pdf, ..., cwcch9.pdf, cwcch10.pdfอื่น ๆ

ในที่สุดสิ่งที่ฉันพยายามทำคือเชื่อมไฟล์ PDF pdftkกับสิ่งต่อไปนี้

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

แต่นั่นไม่ได้ผลเพราะการเรียงลำดับของฉันผิด


ขอบคุณสำหรับคำตอบที่ยอดเยี่ยมทั้งหมดนี้ เช่นเดียวกับ Unix มีวิธีที่ยอดเยี่ยมมากมายในการดูแลแมวตัวนี้
ngm

คำตอบ:


7

บางสิ่งเช่นนี้อาจทำในสิ่งที่คุณต้องการได้

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

อ๊ะวิธีการที่ดี! แน่นอนมันทำในสิ่งที่ฉันขอบคุณ
ngm

62

คุณsortอาจมีความสามารถในการทำเช่นนี้สำหรับคุณ:

sort --version-sort

ตัดตอนมาจากรายการที่เกี่ยวข้องในการจัดเรียงหน้ามนุษย์ -V, --version-sort natural sort of (version) numbers within text
panmari

นี่คือสิ่งที่คุณต้องการ แต่ถ้าการเรียงลำดับของคุณไม่ได้จัดหาตัวเลือกนี้ลองดูที่โพสต์นี้: stackoverflow.com/a/4495368/1240018
eventhorizon

30

สำหรับตัวอย่างนี้คุณสามารถทำสิ่งนี้ได้:

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

นั่นคือเรียงลำดับตัวเลข (-n) บนฟิลด์ที่สอง (-k2) โดยใช้ 'h' เป็นตัวคั่นฟิลด์ (-th)


การแยกและการเรียงลำดับในฟิลด์เดียว - นั่นเป็นเคล็ดลับที่ดีที่ฉันแน่ใจว่าจะมีประโยชน์ในอนาคตขอบคุณ
ngm

6

คุณสามารถใช้-vตัวเลือกใน GNU ls: เรียงลำดับตามธรรมชาติของตัวเลข (รุ่น) ภายในข้อความ

ls -1v cwcch*

สิ่งนี้ไม่ทำงานกับ BSD ls(เช่นบน OS X) ซึ่ง-vตัวเลือกนั้นมีความหมายแตกต่างกัน


นี่คือทางออกที่ง่ายที่สุดมันต้องการคนมากขึ้น!
davidparks21

2

ใช้การขยายเชลล์โดยตรงใน commandline การขยายตัวควรสั่งพวกเขาอย่างถูกต้อง ถ้าฉันเข้าใจ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 ...
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

เคล็ดลับที่ดีที่เพิ่มเข้ามานั่นคือไวยากรณ์การขยายเชลล์ Bourne มาตรฐานหรือbashส่วนขยายหรือไม่
ต้มตุ๋น Quixote


0

Sort -gใช้เพื่อเรียงลำดับตัวเลขตามลำดับจากน้อยไปหามาก

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


ต่อไปนี้หนึ่ง iterates ซับมากกว่าไฟล์ที่มีชื่อของไฟล์ PDF และคว้าหมายเลขเท่านั้นที่มีegrep -oและการใช้การจัดเรียง -gการจัดเรียงตัวเลขในการเรียงลำดับ จากนั้นมันจะป้อนตัวเลขเหล่านี้เพื่อ sed และเสียบเข้าแล้วลบเอาต์พุตของรายการซ้ำด้วย uniq


แทนที่ uniq คุณยังสามารถใช้ awk:

awk '!x[$0]++'

ข้างต้นเทียบเท่ากับ uniq


สิ่งที่คุณกำลังมองหาอยู่นี้เป็นหนึ่งในสายการบิน:

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

ใช่. ฉันรวมเอาท์พุทใน OP ของฉันภายใต้ส่วนแก้ไข
Aguevara
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.