Bash, sayıları ile dizeleri sıralamak nasıl?


37

Bu dosyaları bir dizinde varsa

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

Onları Bash'de nasıl listeleyebilirim ki dizginin sayı kısmına göre artan bir sıraya girsinler. Sonuçta ortaya çıkan sıra cwcch1.pdf, cwcch2.pdf, ..., cwcch9.pdf, cwcch10.pdf, vb.

Sonunda yapmaya çalıştığım pdftkşey , pdf'leri aşağıdaki gibi bir şeyle birleştirmek.

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

ama sıralama yanlış olduğu için işe yaramıyor.


Tüm bu güzel cevaplar için teşekkürler. Her zaman olduğu gibi Unix'te, bu kedinin cildini kapmanın birçok farklı mükemmel yolu vardır.
NGM

Yanıtlar:


7

Bunun gibi bir şey, biraz farklı bir yaklaşım gerektirse de, istediğinizi yapabilir:

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

Aha, iyi yaklaşım! Gerçekten ne yaptığımı yapar, teşekkürler.
NGM


30

Bu özel örnek için şunu da yapabilirsiniz:

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

Yani, alan ayırıcı (-th) olarak 'h' kullanarak ikinci alanda (-k2) sayısal olarak (-n) sıralayın.


Bölmek ve sonra bir alanda sıralama yapmak - bu gelecekte kullanabileceğimden emin olduğum için harika bir ipucu.
NGM

6

-vSeçeneği GNU'da kullanabilirsiniz ls: metin içindeki doğal tür (sürüm) sayıları.

ls -1v cwcch*

Bu ls, -vseçeneğin farklı bir anlamı olduğu BSD ile (örneğin OS X'te) çalışmaz .


Bu en basit çözüm, millet için daha fazla upvotes ihtiyacı var!
davidparks21

2

Kabuk genişlemesini doğrudan komut satırında kullanın. Genişletme onları uygun şekilde sıralamalıdır. Ben anlamak pdftkdüzgün 'ın komut sözdizimi, bu ne istediğinizi yapacak:

# 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

Veya farklı bir yaklaşım deneyebilirsiniz. Böyle bir şey yapmam gerektiğinde, genellikle numaralarımı önceden doğru biçimlendirmeye çalışırım. Geç geldiğimde ve PDF'ler zaten örneğiniz gibi numaralandırılmışsa, bunu yeniden numaralandırmak için kullanacağım:

# 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

Şimdi standart lssıralama düzgün çalışacaktır.


2
Belki biraz daha kısaca:pdftk cwcch{{1..9},{10..18}}.pdf ...
sonraki bildirime kadar duraklatıldı.

İyi bir ipucu, eklenen standart bir Bourne kabuğu genişleme sözdizimi bashmi yoksa bir uzantı mı?
quack quixote


0

Sırala -g , artan sırada sayıları sıralamak için kullanılır.

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


Aşağıdaki astar, PDF dosyalarının adlarını içeren bir dosya üzerinde yinelenir ve sayıları yalnızca egrep -o ile alır ve sayıları artan sırada sıralamak için sort -g komutunu kullanır . Sonra bu sayıları ayarlayıp takması için besler. Sonra kopyaların uniq ile çıktısını alır.


Uniq yerine awk kullanabilirsiniz:

awk '!x[$0]++'

Yukarıdaki, uniq'e eşdeğerdir.


Aradığın şey şu bir astar:

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 içeriği:

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 

DÜZENLE:

Komutun Çıktısı:

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

Does bu üzerinde bir astar çalışmaları tmpdosyası? Cevaba yapıştırılacak herhangi bir çıktı var mı?
Xen2050

Evet. OP bölümündeki çıktıyı düzenleme bölümünün altına dahil ettim.
Aguevara
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.