Donnerstag, Februar 27, 2020

Sortieren nach mehreren Spalten in der bash

Ich habe eine Datei mit 2 Spalten, „Name“ und „Alter“, die Aussehen wie diese:

Alex,  15
Mary,  12
Alex,  28
Zoe,   16
Alex,  17

Werde ich Sortieren nach der ersten Spalte in alphabetischer Reihenfolge, mit sort -t ',' -k1,1 filename.txt, aber wenn es gleiche Namen, ich will die 2. Spalte sortiert werden, in umgekehrter Weise, wie Sie in der ursprünglichen Datei, so wie hier:

Alex,  17
Alex,  28
Alex,  15
Mary,  12
Zoe,   17

Wie kann ich dies tun?

InformationsquelleAutor Alex | 2016-12-19

5 Kommentare

  1. 2

    Datei Lesen, von hinten, Sortieren nach der ersten Spalte und -s zu bewahren, um im Falle von gleichen Wert

    tac filename.txt | sort -k1,1 -s
    ...
    Alex,  17
    Alex,  28
    Alex,  15
    Mary,  12
    Zoe,   16
    • Können Sie akzeptieren meine Antwort, danke zu sagen, noch mehr ;P
  2. 1

    Wops es scheint, dass ich falsch verstanden, dein problem. Ich kann nicht finden, von einem magischen Befehl, aber ein kleines Skript könnte die Arbeit zu tun:

    #! /bin/bash
    declare names_sorted=$(cut -d, -f1 filename.txt | sort -k1,1 | uniq)
    for name in $names_sorted ; do
        grep "$name," filename.txt | tac
    done

    Kurze Erklärung:

    1. zuerst montieren wir die sortierte Liste der Namen: $names_sorted.
    2. nächsten (vorausgesetzt, die Namen enthalten keine white-spaces), wir grep die einzelnen Namen aus der Liste und wieder, dass, um mit dem Befehl tac

    Hoffe es ist das, was Sie wollte, zu dieser Zeit 😉

    • ja, es ist das, was ich wollte, danke Mann
  3. 1

    Nicht sicher, warum Sie wollen, dies zu tun! Aber man kann in python ziemlich leicht (nicht preserve whitespace):

    import sys
    entries    = [tuple(map(lambda x: x.strip(), line.strip().split(","))) for line in sys.stdin]
    names,ages = zip(*entries)
    
    def compare(a,b):
        res = cmp(a[0], b[0])
        if (res == 0):
            return -cmp(ages.index(a[1]), ages.index(b[1]))
        return res
    
    print "\n".join("%s %s" % (name,age) for name,age in sorted(entries, cmp=compare))
    • danke trotzdem, Mann, aber sorry, ich bin nicht so weit 🙂
  4. 1
    sort -t ',' -k1,1 -k2,2r filename.txt

    oder

    sort -t ',' -k1,1 -k2r,2 filename.txt

    Ausgabe:

    Alex,  28
    Alex,  17
    Alex,  15
    Mary,  12
    Zoe,   16

    Erklären: -t ist die Angabe der Feld-separator, -k können verwendet werden, um geben Sie die start-und Stopp-position des Feldes, und wir könnten hinzufügen eines einzigen Buchstaben OPTS für das Feld für die Bestellung, zum Beispiel r bedeutet umkehren das Ergebnis der Vergleiche.

    • Es ist besser, wenn Sie erklären, warum Ihre Antwort funktioniert. Es kann helfen, die künftigen Leser.
    • Ich danke Ihnen sehr für Ihre Kommentare. Ich erkläre es später.
  5. 0

    Dieser sollte gibt, was Sie wollen:

    sort -k1,1 -k2,2 filename.txt
    • Nein, -k2,2 ist die Sortierung wieder alphabetisch, möchte ich die Sortierung der Spalte Alter in umgekehrter Weise, wie Sie in der Datei auftreten, zum ersten mal.

Kostenlose Online-Tests