2013-06-12 16 views
39

Często chciałem sortować ciągi zawierające liczby, aby podczas sortowania np. abc_2, abc_1, abc_10 wynikiem jest abc_1, abc_2, abc_10. Każdy mechanizm sortowania, jaki widziałem, jest sortowany jako abc_1, abc_10, abc_2, czyli znak po znaku od lewej.bash: sortowanie ciągów o numerach

Czy istnieje skuteczny sposób sortowania, aby uzyskać pożądany wynik? Pomysł patrzenia na każdy znak, ustalenie, czy jest to cyfra, budowanie podłańcucha z kolejnych cyfr i sortowanie go jako liczby jest zbyt przerażające, aby kontemplować w bash.

Nie ma brodatego * nix guru zaimplementował alternatywną wersję sort z opcją --sensible_numerical?

+0

Czy Twój prefiks zawsze takie same? –

Odpowiedz

75

Wykonaj ten

sort -t _ -k 2 -g data.file 
  • -t separator
  • -k klucz/kolumny
  • -g ogólny porządek numeryczny
+1

Potrzebuje sortować według numeru - jest to drugie pole: 'printf" abc_2 \ nabc_1 \ nabc_10 \ n "| sort -t _ -k 2 -g' –

+0

@RomanNewaza, Dzięki! Wiesz, zero to także liczba. :-) –

+1

To nie jest oparte na zera. Spójrz na stronę man. –

21

Myślę, że to rozszerzenie GNU do sort, ale szukasz opcji --version-sort (lub -V):

$ printf "prefix%d\n" $(seq 10 -3 1) 
prefix10 
prefix7 
prefix4 
prefix1 

$ printf "prefix%d\n" $(seq 10 -3 1) | sort 
prefix1 
prefix10 
prefix4 
prefix7 

$ printf "prefix%d\n" $(seq 10 -3 1) | sort --version-sort 
prefix1 
prefix4 
prefix7 
prefix10 

https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html

+0

Niestety, ta opcja nie została jeszcze wdrożona w starszej wersji sortowania dostępnej w geriatrycznej wersji RHEL, nad którą pracuję. – hardcode57

+0

"sort-V" działało dobrze dla mnie. – nurettin

+0

"sort -V" działało również dla mnie, której wersji RHEL używasz? –

18

Spróbuj

$ cat a.txt 
abc_1 
abc_4 
abc_2 
abc_10 
abc_5 

$ sort -V a.txt 
abc_1 
abc_2 
abc_4 
abc_5 
abc_10 
Powiązane problemy