2013-06-12 43 views
39

Ich wollte oft Strings mit Zahlen in ihnen sortieren, so dass, wenn z. abc_2, abc_1, abc_10 das Ergebnis ist abc_1, abc_2, abc_10. Jeder Sortiermechanismus, den ich gesehen habe, sortiert sich als abc_1, abc_10, abc_2, also Zeichen für Zeichen von links.Bash: Sortieren von Strings mit Zahlen

Gibt es eine effiziente Möglichkeit zu sortieren, um das gewünschte Ergebnis zu erhalten? Die Idee, jedes Zeichen zu betrachten, zu bestimmen, ob es eine Zahl ist, einen Teilstring aus nachfolgenden Zahlen zu bilden und danach als Zahl zu sortieren, ist zu erschreckend, um in bash nachzusinnen.

Hat keine bärtige * nix guru implementiert eine alternative Version von sort mit einer --sensible_numerical Option?

+0

Ist Ihr Präfix immer gleich? –

Antwort

75

Führen Sie diesen

sort -t _ -k 2 -g data.file 
  • -t Separator
  • -k key/Spalte
  • -g allgemeine numerische Sortierung
+1

Er muss nach Nummer sortieren - es ist das zweite Feld: 'printf 'abc_2 \ nabc_1 \ nabc_10 \ n" | Sortierung -t _ -k 2 -g' –

+0

@RomanNewaza, Danke! Sie wissen, Null ist auch eine Zahl. :-) –

+1

Dies ist nicht Null basiert. Schau dir die Manpage an. –

21

Ich denke, dies zu sort eine GNU-Erweiterung ist, aber Sie suchen nach der Option --version-sort (oder -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

Leider wurde diese Option noch nicht in der alten Version von sort avilable auf der geriatrischen Version von RHEL implementiert, auf der ich gerade entwickle. – hardcode57

+0

"sort -V" hat gut für mich gearbeitet. – nurettin

+0

"sort -V" hat auch für mich funktioniert, welche Version von RHEL benutzt du? –

18

Versuchen Sie, diese

$ 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 
Verwandte Themen