2010-07-07 5 views
13

Ich möchte eine Datei auf mehrere Felder sortieren. Eine Probe durch Tabulatoren getrennte Datei ist:Unix-Sortierung, mit primären und sekundären Schlüsseln

a 1 1.0 
b 2 0.1 
c 3 0.3 
a 4 0.001 
c 5 0.5 
a 6 0.01 
b 7 0.01 
a 8 0.35 
b 9 2.3 
c 10 0.1 
c 11 1.0 
b 12 3.1 
a 13 2.1 

und ich möchte es alphabetisch nach Feld 1 (mit -d) haben sortiert und wenn Feld1 ist die gleiche, sortiert nach Feld 3 (mit der -g Option).

A ist es nicht gelungen, dies zu tun. Meine attemps waren (mit einem echten TABULATORZEICHEN statt <TAB>):

cat tst | sort -t"<TAB>" -k1 -k3n 
cat tst | sort -t"<TAB>" -k1d -k3n 
cat tst | sort -t"<TAB>" -k3n -k1d 

Keine von diesen arbeiten. Ich bin mir nicht sicher, ob das überhaupt möglich ist. Ich werde ein Skript zur Problemumgehung schreiben, also bin ich nur neugierig, ob es eine Lösung gibt, die nur sort verwendet.

+0

Die ' sort'-Befehl scheint das nicht zu unterstützen. Erwägen Sie stattdessen, zu einer Sprache wie Python oder Perl zu wechseln. – Philipp

+0

Ja, natürlich wird das meine Problemumgehung sein, wie ich bereits erwähnt habe. Ich wollte nur wissen, ob man es mit reinem Sort machen kann – zseder

Antwort

11

Die manual zeigt einige Beispiele.

Gemäß zseder Kommentar, das funktioniert:

sort -t"<TAB>" -k1,1d -k3,3g 

Tab theoretisch auch wie diese sort -t"\t" funktionieren sollte.

Wenn keine der oben genannten Arbeiten von Registerkarte zu begrenzen, ist dies eine hässliche Abhilfe:

TAB=`echo -e "\t"` 
sort -t"$TAB" 
+0

Das funktioniert! Vielen Dank. (Mit cmd: 'sort -t" "-k1,1d -k3,3g') Allerdings habe ich im verknüpften Handbuch und der normalen Manpage nicht gefunden, was Komma für die Sortierung bedeutet. Ich muss mehr darüber googlen. Und ja, ich kann mit Tabs sortieren. Ich kann es zu jedem anderen Trennzeichen sedieren, und ich kann TAB meinem Terminal mit "Strg + v; TAB" geben, also ist es kein Problem, ich wollte nur klar machen, dass das nicht ist, was ich falsch mache. Wie auch immer, Danke! – zseder

+1

Sie können auch eine Registerkarte erstellen, ohne 'echo' oder ctrl + v:' TAB = $ '\ t'' zu verwenden. @zseder: Das Komma ist in diesem Kontext ein Bereichsoperator. Das Argument "-k1,1d" bedeutet "erzeuge einen Schlüssel, der in der ersten Spalte beginnt und in der ersten Zeile in der ersten Zeile endet". –

+0

Und wieso ist -k1d nicht gleich -k1,1d? Meine Absicht ist, dass diese gleich sein sollten ... – zseder

-3

Hier ist ein Python-Skript, das Sie als Ausgangspunkt verwendet werden könnten:

#!/usr/bin/env python2.6 

import sys 
import string 

def main(): 
    fname = sys.argv[1] 
    data = [] 
    with open(fname, "rt") as stream: 
     for line in stream: 
      line = line.strip() 
      a, b, c = line.split() 
      data.append((a, int(b), float(c))) 
    data.sort(key=my_key) 
    print data 


def my_key(item): 
    a, b, c = item 
    return c, lexicographical_key(a) 


def lexicographical_key(a): 
    # poor man's attempt, should use Unicode classification etc. 
    return a.translate(None, string.punctuation) 


if __name__ == "__main__": 
    main() 
Verwandte Themen