В ударе, как отсортировать строки с числами в них?

Если у меня есть эти файлы в каталоге

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, и т.д.

То, что я в конечном счете пытаюсь сделать, связывают pdfs с pdftk с чем-то как следующее

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

но это не работает, поскольку моя сортировка является неправильной.

38
задан 06.12.2009, 02:20

4 ответа

Что-то вроде этого могло бы сделать то, что Вы хотите, хотя это проявляет немного отличающийся подход:

pdftk $(for n in {1..18}; do echo cwcch$n.pdf; done) cat output output.pdf
7
ответ дан 07.12.2019, 08:48

Ваш sort может иметь способность сделать это для Вас:

sort --version-sort
63
ответ дан 07.12.2019, 08:48

Для этого конкретного примера Вы могли также сделать это:

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

Таким образом, вид численно (-n) на втором поле (-k2) с помощью 'h' как разделитель полей (-th).

30
ответ дан 07.12.2019, 08:48

Используйте расширение оболочки непосредственно в командной строке. Расширение должно заказать им правильно. Если я понимаю 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

Или можно попробовать другой подход. Когда я должен сделать что-то вроде этого, я обычно пытаюсь отформатировать свои числа правильно заранее. Если я войду в него поздно, и PDFs уже пронумерованы как Ваш пример, то я буду использовать это для изменения нумерации:

# 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
ответ дан 07.12.2019, 08:48

Теги

Похожие вопросы