2009-11-17 47 views
26

với một kịch bản bash trước tôi đã tạo ra một danh sách các tập tin:Bash và sắp xếp các file theo thứ tự

data_1_box 
data_2_box 
... 
data_10_box 
... 
data_99_box 

điều là bây giờ tôi cần phải tiếp nhau chúng, vì vậy tôi cố gắng

ls -l data_ *

nhưng tôi nhận

..... 
data_89_box 
data_8_box 
data_90_box 
... 
data_99_box 
data_9_box 

nhưng tôi cần phải nhận được trong sucession 1, 2, 3, 4, .. 9, ..., 89, 90, 91, ... , 99

Nó có thể được thực hiện trong bash không?

Trả lời

47
ls data_* | sort -n -t _ -k 2 

-n: các loại số lượng
-t: lĩnh vực tách '_'
-k: sắp xếp trên trường thứ hai, trong trường hợp của bạn, các con số sau chữ '_'

+0

có !! đã làm các trick, cảm ơn! – flow

+0

Tôi đã sử dụng 'sắp xếp' trong nhiều năm, không bao giờ bận tâm đọc trang người đàn ông - dường như tôi thực sự đã bỏ lỡ. Cảm ơn! :-) – ssc

2

Đây là câu trả lời chung! Bạn cần phải áp dụng quy tắc để thiết lập dữ liệu cụ thể

ls | sort 

Ví dụ:

ls | sort -n -t _ -k 2 
+0

-1? Tôi đã thay đổi thành -l, nhưng tôi không nhận được kết quả theo thứ tự đó – flow

+0

Bạn có thực sự * thử * điều đó không? – paxdiablo

+0

nếu thử ls -1 | sort -n tôi nhận được ... data_89_box data_90_box ... data_99_box data_9_box (kết thúc) nhưng tôi muốn chúng theo thứ tự tuần tự – flow

7

đầu tiên nếu số sort của bạn có sắp xếp phiên bản, tr y:

ls -1 | sort -V 

(đó là vốn V).

19

Cách sử dụng cờ -v để ls? Mục đích của lá cờ là để sắp xếp các file theo số phiên bản, nhưng nó hoạt động giống như tốt ở đây và loại bỏ nhu cầu ống kết quả để sort:

ls -lv data_* 
-1

Một gợi ý tôi có thể nghĩ là thế này:

for i in `seq 1 5` 
do 
    cat "data_${i}_box" 
done 
1

Dưới đây là cách để làm điều đó trong bash nếu sắp xếp của bạn không có phiên bản sắp xếp:

cat <your_former_ls_output_file> | awk ' BEGIN { FS="_" } { printf("%03d\n",$2) }' | sort | awk ' { printf("data_%d_box\n", $1) }' 

Tất cả trong một dòng. Hãy ghi nhớ, tôi chưa thử nghiệm điều này trên dữ liệu cụ thể của bạn, vì vậy nó có thể cần một chút tinh chỉnh để hoạt động chính xác cho bạn. Điều này phác thảo một giải pháp tốt, mạnh mẽ và tương đối đơn giản, mặc dù. Tất nhiên, bạn luôn có thể hoán đổi tên tệp cat + ngay từ đầu bằng một ls thực để tạo dữ liệu tệp khi đang di chuyển. Để chụp cột tên tập tin thực tế, bạn có thể chọn giữa các thông số ls chính xác hoặc đường ống thông qua việc cắt hoặc bị lấn.

1

có lẽ bạn sẽ thích SistemaNumeri.py ("số sửa chữa"): nó đổi tên của bạn

data_1_box 
data_2_box 
... 
data_10_box 
... 
data_99_box 

trong

data_01_box 
data_02_box 
... 
data_10_box 
... 
data_99_box 
Các vấn đề liên quan