Trong bash, làm thế nào để sắp xếp các chuỗi với số trong đó?


37

Nếu tôi có những tập tin này trong một thư mục

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

làm thế nào tôi có thể liệt kê chúng trong Bash để chúng theo thứ tự số tăng dần dựa trên phần số của chuỗi. Vì vậy, thứ tự kết quả là cwcch1.pdf, cwcch2.pdf, ..., cwcch9.pdf, cwcch10.pdf, vv

Điều cuối cùng tôi đang cố gắng làm là ghép các pdf pdftkvới một cái gì đó như sau

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

nhưng điều đó không làm việc vì sự sắp xếp của tôi là sai.


Cảm ơn tất cả các câu trả lời tuyệt vời cho điều này. Như mọi khi với Unix, có rất nhiều cách tuyệt vời khác nhau để chăm sóc chú mèo này.
ngm

Câu trả lời:


7

Một cái gì đó như thế này có thể làm những gì bạn muốn, mặc dù nó có một cách tiếp cận hơi khác:

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

Aha, cách tiếp cận tốt đẹp! Nó thực sự làm những gì tôi, cảm ơn.
ngm


30

Đối với ví dụ cụ thể này, bạn cũng có thể làm điều này:

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

Đó là, sắp xếp số (-n) trên trường thứ hai (-k2) bằng cách sử dụng 'h' làm dấu tách trường (-th).


Chia tách và sau đó sắp xếp trên một lĩnh vực - đó là một mẹo tuyệt vời mà tôi chắc chắn sẽ có ích trong tương lai, cảm ơn.
ngm

6

Bạn có thể sử dụng -vtùy chọn trong GNU ls: sắp xếp tự nhiên các số (phiên bản) trong văn bản.

ls -1v cwcch*

Điều này không hoạt động với BSD ls(ví dụ trên OS X), trong đó -vtùy chọn có ý nghĩa khác.


Đây là giải pháp đơn giản nhất, nó cần nhiều người ủng hộ hơn!
davidparks21

2

Sử dụng mở rộng vỏ trực tiếp trong một dòng lệnh. Việc mở rộng nên đặt chúng đúng cách. Nếu tôi hiểu pdftkđúng cú pháp dòng lệnh, điều này sẽ làm những gì bạn muốn:

# 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

Hoặc bạn có thể thử một cách tiếp cận khác. Khi tôi cần làm một cái gì đó như thế này, tôi thường cố gắng để các số của tôi được định dạng đúng trước thời hạn. Nếu tôi đến muộn và các tệp PDF đã được đánh số như ví dụ của bạn, tôi sẽ sử dụng số này để đánh số lại:

# 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

Bây giờ lsphân loại tiêu chuẩn sẽ hoạt động đúng.


2
Có lẽ ngắn gọn hơn một chút:pdftk cwcch{{1..9},{10..18}}.pdf ...
Tạm dừng cho đến khi có thông báo mới.

mẹo hay, được thêm vào. Đó là cú pháp mở rộng vỏ Bourne tiêu chuẩn hay bashphần mở rộng?
quixote quixote

2

Đây là một phương pháp chỉ sử dụng sort:

ls | sort -k1.6n

0

Sắp xếp -g được sử dụng để sắp xếp các số theo thứ tự tăng dần.

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


Một lớp lót sau lặp lại qua một tệp có tên của các tệp PDF và chỉ lấy các số bằng egrep -o và sử dụng sort -g để sắp xếp các số trong theo thứ tự tăng dần . Sau đó, nó cung cấp cho các số này để sed và cắm chúng vào. Sau đó, đầu ra của các bản sao với uniq.


Thay vì uniq, bạn cũng có thể sử dụng awk:

awk '!x[$0]++'

Ở trên là tương đương với uniq.


Những gì bạn đang tìm kiếm là này một lót:

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


Nội dung của 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 

CHỈNH SỬA:

Đầu ra của lệnh:

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

Liệu này làm việc một lót trên tmptập tin? Bất kỳ đầu ra để dán vào câu trả lời?
Xen2050

Vâng. Tôi đã bao gồm đầu ra trong OP của tôi dưới phần chỉnh sửa.
Aguevara
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.