2013-06-05 23 views
5

tôi có một danh sách các tập tin với một số phiên bản vào cuối rằng tôi cần phải sắp xếpbash danh sách loại dây bằng số ở cuối

/this/is/a/file/path/product-2.0/file/name/7 
/this/is/a/file/path/product-2.0/file/name/10 
/this/is/a/file/path/product-2.0/file/name/12 
/this/is/a/file/path/product-2.0/file/name/13 
/this/is/a/file/path/product-2.0/file/name/6 
/this/is/a/file/path/product-2.0/file/name/8 
/this/is/a/file/path/product-2.0/file/name/9 

khi tôi ống thông qua grep nó loại như vậy:

echo $files | sort -n 
/this/is/a/file/path/product-2.0/file/name/10 
/this/is/a/file/path/product-2.0/file/name/12 
/this/is/a/file/path/product-2.0/file/name/13 
/this/is/a/file/path/product-2.0/file/name/6 
/this/is/a/file/path/product-2.0/file/name/7 
/this/is/a/file/path/product-2.0/file/name/8 
/this/is/a/file/path/product-2.0/file/name/9 

Tôi nghĩ rằng -n đang bị nhầm lẫn bởi số đầu tiên trong tên tệp.

Làm thế nào tôi có thể sắp xếp nó số lượng bằng số cuối cùng

+0

Luôn luôn cùng chiều sâu của con đường? – Kevin

+0

có, nhưng tôi không biết chiều sâu cho đến khi tôi đang cố gắng để sắp xếp –

Trả lời

11
Kaizen ~/so_test $ cat ztestfile1 | sort -t'/' -n -k10 
/this/is/a/file/path/product-2.0/file/name/6 
/this/is/a/file/path/product-2.0/file/name/7 
/this/is/a/file/path/product-2.0/file/name/8 
/this/is/a/file/path/product-2.0/file/name/9 
/this/is/a/file/path/product-2.0/file/name/10 
/this/is/a/file/path/product-2.0/file/name/12 
/this/is/a/file/path/product-2.0/file/name/13 

không trợ giúp này?

cách khác tức là để được độc lập từ vị trí .....

Kaizen ~/so_test $ cat ztestfile1 | sort -V 
/this/is/a/file/path/product-2.0/file/name/6 
/this/is/a/file/path/product-2.0/file/name/7 
/this/is/a/file/path/product-2.0/file/name/8 
/this/is/a/file/path/product-2.0/file/name/9 
/this/is/a/file/path/product-2.0/file/name/10 
/this/is/a/file/path/product-2.0/file/name/12 
/this/is/a/file/path/product-2.0/file/name/13 

xin lưu ý nó là một lựa chọn -V (Capital) trong loại trông vào sự khác biệt số trong một chuỗi để sắp xếp ... .. giống như số phiên bản.

nội dung trang

người đàn ông ::

-V, --version-sort 
      natural sort of (version) numbers within text 
+0

đây là những gì tôi đã cố gắng ngoại trừ việc tôi đã đi theo trang người đàn ông và có thêm không gian 'sort -n -t '/' -k 10' và dường như sắp xếp không giống như vậy –

+0

ohh ok, có vẻ vấn đề được sắp xếp ngay bây giờ ... :) – nsd

+0

Hãy lưu ý rằng với loại giải pháp bạn phải biết và chỉ định độ sâu của tệp. – michas

3

Bạn có thể sử dụng / như một cột tách:

sort -n -t/ -k 10 
+0

bạn giành chiến thắng .... câu trả lời của bạn là 1 phút trước chúng tôi :) +1 – nsd

1

Sử dụng awk để mang lại trường cuối cùng vào phía trước, sort bởi trường 1st , sau đó áp dụng cut để loại bỏ trường đầu tiên. Một ví dụ sử dụng một here document dưới

awk -F'/' '{print($NF"/"$0)}' <<! | sort -k1n,1n -t'/' | cut -f2- -d'/' 
> /this/is/a/file/path/product-2.0/file/name/7 
> /this/is/a/file/path/product-2.0/file/name/10 
> /this/is/a/file/path/product-2.0/file/name/12 
> /this/is/a/file/path/product-2.0/file/name/13 
> /this/is/a/file/path/product-2.0/file/name/6 
> /this/is/a/file/path/product-2.0/file/name/8 
> /this/is/a/file/path/product-2.0/file/name/9 
> ! 
/this/is/a/file/path/product-2.0/file/name/6 
/this/is/a/file/path/product-2.0/file/name/7 
/this/is/a/file/path/product-2.0/file/name/8 
/this/is/a/file/path/product-2.0/file/name/9 
/this/is/a/file/path/product-2.0/file/name/10 
/this/is/a/file/path/product-2.0/file/name/12 
/this/is/a/file/path/product-2.0/file/name/13 
0

này được bạn sắp xếp theo mục cuối cùng trong đường dẫn bằng cách sử dụng / để tách các lĩnh vực, có tính đến giá trị cuối cùng và đặt nó ở đầu dòng, phân loại , sau đó xóa giá trị từ đầu dòng.

cat data | awk 'BEGIN { FS="/"} { print $(NF) " " $0 }' | sort -n | sed 's/^.*\s//g' 
0

Hoặc sử dụng một cái gì đó một liner như perl hoặc ruby:

ruby -we 'print *readlines.sort_by{|x| File.basename(x).to_i}' 
Các vấn đề liên quan