2010-11-25 7 views
12

Ich habe eine Liste von Tabellennamen, die nicht in der richtigen Reihenfolge sind. Wie kann ich sie in der richtigen logischen Reihenfolge erhalten?Wie kann ich alphanumerische Zeichenfolgen in Unix sortieren?

$ cat list.txt

TAB1 
TAB13 
TAB11 
TAB19 
TAB2 
TAB3 
TAB16 
TAB17 
TAB18 
TAB9 
TAB10 
TAB8 
TAB12 
TAB20 

$ cat list.txt | sort -n

TAB1 
TAB10 
TAB11 
TAB12 
TAB13 
TAB16 
TAB17 
TAB18 
TAB19 
TAB2 
TAB20 
TAB3 
TAB8 
TAB9 

Erwartetes Auftrags:

TAB1 
TAB2 
TAB3 
TAB8 
TAB9 
TAB10 
TAB11 
TAB12 
TAB13 
TAB16 
TAB17 
TAB18 
TAB19 
TAB20 

Alle vim Abkürzungen werden auch tun, ich brauche nicht unbedingt ein separates Dienstprogramm dafür.

+0

Bookmarking, weil es so eine gute Frage ist (mit einigen guten Antworten) –

Antwort

19

Sie müssen es sagen, wo Ihre Sortierschlüssel beginnt:

sort -n -k1.4 list.txt 

sonst wird es von Anfang an beginnt, schlägt eine Zeichenfolge in eine Zahl zu konvertieren und zurück in alphabetischer Vergleich fällt.

+0

+1 für schneller :), – Adrien

+6

Es hat mich ein bisschen gebraucht, um herauszufinden, wie -k funktioniert: 1 ist die Feldnummer und 4 ist das Zeichen. Wenn nach dem T in TAB ein Leerzeichen (das Standardfeldtrennzeichen) vorhanden wäre, würden Sie 'sort -n -k2.4 list.txt' verwenden. Sie können -t verwenden, um benutzerdefinierte Feldtrennzeichen anzugeben. 'sort -n -tB -k2.1 list.txt' würde auch funktionieren, weil das B in TAB die Felder teilt und wir das erste Zeichen des zweiten Feldes bis zum Ende der Zeile sortieren würden. – idbrii

7

Da dies als eine Vim-Frage markiert ist, dachte ich, es könnte die Erwähnung der Vim-Option wert sein (obwohl ich persönlich sort verwenden würde, da die Daten bereits in einer Datei sind). Es ist einfach

:sort n 

Da Vims numerische Sortierung auf die ersten Dezimalzahl ignoriert up, man braucht nicht den „TAB“ zu ignorieren (:sort ein Muster nehmen zu ignorieren, :sort n /TAB/ wie gut funktionieren würde, zum Beispiel) . Wie üblich, :h :sort für weitere Informationen.

+0

Danke. Ich wusste das nicht. Ich musste sehr viel Mühe haben, den _string_ zu löschen, ihn zu sortieren und den _string_ zurückzusetzen. –

+0

@jeffjose: Das funktioniert nur, wenn Sie in allen Fällen die gleiche Zeichenfolge haben; Es scheitert, wenn Sie es nicht tun. Das Schlimmste ist, wenn Sie dem Shell-Befehl 'sort -kX.Yn' keine feste Position übergeben können. Ich musste oft ein Perl-Skript schreiben, um mit diesen Situationen umzugehen, und wünschte, ich hätte es nicht getan. Ähnliches gilt für die Sortierung nach dem letzten Feld, wenn es eine variable Anzahl von Feldern gibt, obwohl Sie dort die Reihenfolge der Felder einfach umkehren, sortieren und dann wieder zurückführen können. – tchrist

2

Sie können dies in Perl tun, oder jede Sprache, wo sortieren Sie einen Vergleichsoperator angeben können.

sub numcomp() {

$a =~ /([0-9]*)$/; $aa = $1; 
$b =~ /([0-9]*)$/; $bb = $1; 
$aa <=> $bb; 

}

sort numcomp @mylist...

(Stören Sie nicht mich zu sagen Baby Perl ich ... äh, ich es so geschrieben absichtlich, so dass es leicht zu verstehen wäre.) (Ärgere dich nicht zu sagen, dass es falsch ist. Ich ... ähm, ich schrieb es absichtlich als Übung für den Leser.)

18

Sie können immer Führen Sie eine Sortierung mit dem Argument -V durch, um die alphanumerische Zeichenfolge zu sortieren.

$ sort -V inputfile > outputfile 

$ cat inputfile 
TAB1 
TAB13 
TAB11 
TAB19 
TAB2 
TAB3 
TAB16 
TAB17 
TAB18 
TAB9 
TAB10 
TAB8 
TAB12 
TAB20 

$ cat outputfile 
TAB1 
TAB2 
TAB3 
TAB8 
TAB9 
TAB10 
TAB11 
TAB12 
TAB13 
TAB16 
TAB17 
TAB18 
TAB19 
TAB20 
Verwandte Themen