2013-06-05 11 views
5

Mam listę plików z numerem wersji w końcu, że trzeba posortowaćbash sortowania listy ciągów według numeru na koniec

/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 

kiedy rura go przez grep to jakby tak:

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 

Myślę, że -n jest zdezorientowany przez pierwszy numer w nazwie pliku.

Jak mogę rozwiązać to numerycznie przez ostatniego numeru

+0

Zawsze ta sama głębokość toru? – Kevin

+0

tak, ale nie znam głębokości, dopóki nie próbuję sortować –

Odpowiedz

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 

Czy to pomoże?

alternatywnym sposobem czyli być niezależny od położenia .....

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 

proszę opcję -V (kapitał) w rodzaju, który wygląda na różnice numerycznych w ciąg sortowania zanotować jego ... .. jak w numerze wersji.

mężczyzna strona tekst ::

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

to jest to, co próbowałem, oprócz tego, że szedłem przez strona podręcznika i ma dodatkowe spacje "sort -n -t"/"-k 10" i najwyraźniej sortowanie nie lubi tego –

+0

ohh ok, wydaje się, że problem jest teraz posortowany ... :) – nsd

+0

Należy pamiętać, że z tego rodzaju rozwiązanie, które musisz znać i określić głębokość plików. – michas

3

Można użyć / jako separator kolumna:

sort -n -t/ -k 10 
+0

wygrywasz .... Twoja odpowiedź była 1 minuta przed nami :) +1 – nsd

1

użytkowania awk przynieść ostatnie pole do przodu, sort przez 1st dziedzinie , następnie zastosuj cut, aby pozbyć się pierwszego pola. Przykładem korzystania z here document poniżej

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

ten dostaje klasyfikowane według ostatniego elementu na ścieżce za pomocą / jako separator pól, biorąc ostatnią wartość i umieszczenie go na początku linii, sortowanie , a następnie usunięcie wartości z początku linii.

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

Albo użyć czegoś jedno-liner jak Perl czy Ruby

ruby -we 'print *readlines.sort_by{|x| File.basename(x).to_i}' 
Powiązane problemy