22 Stimmen

Unix-Sortierung, mit Primär- und Sekundärschlüssel

Ich würde gerne eine Datei nach mehreren Feldern sortieren. Ein Beispiel für eine tabulatorgetrennte Datei ist:

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 würde es gerne alphabetisch nach Feld 1 sortiert haben (mit -d ), und wenn Feld1 gleich ist, nach Feld 3 sortieren (mit der Option -g Option).

A ist dies nicht gelungen. Meine Versuche waren (mit einem echten TAB-Zeichen anstelle von <TAB> ) :

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

Nichts davon funktioniert. Ich bin mir nicht sicher, ob die Sorte überhaupt in der Lage ist, dies zu tun. Ich werde ein Skript zur Abhilfe schreiben, also bin ich einfach neugierig, ob es eine Lösung gibt, die nur sortieren .

24voto

Janick Bernet Punkte 19324

El Handbuch zeigt einige Beispiele.

In Übereinstimmung mit dem Kommentar von zseder funktioniert dies:

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

Tab sollte theoretisch auch so funktionieren sort -t"\t" .

Wenn keine der oben genannten Möglichkeiten zur Abgrenzung durch Tabulatoren funktioniert, ist dies eine unschöne Abhilfe:

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

-5voto

Philipp Punkte 45643

Hier ist ein Python-Skript, das Sie als Ausgangspunkt verwenden können:

#!/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()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X