Linux-Shell-Sortierdatei nach der zweiten Spalte?

88

Ich habe eine Datei wie diese:

FirstName, FamilyName, Address, PhoneNumber

Wie kann ich es nach Familienname sortieren?

Rami Jarrar
quelle
Welcher Betriebssystem- und Befehlsprozessor?
Preet Sangha
1
Mögliches Duplikat von Unix Sort mit Tab Delimiter
Ciro Santilli 法轮功 冠状 病 六四 六四 法轮功

Antworten:

152

Wenn dies UNIX ist:

sort -k 2 file.txt

Sie können mehrere -kFlags verwenden, um nach mehr als einer Spalte zu sortieren. Zum Beispiel, um nach Familiennamen und dann nach Vornamen als Krawattenbrecher zu sortieren:

sort -k 2,2 -k 1,1 file.txt

Relevante Optionen von "man sort":

-k, --key = POS1 [, POS2]

Starten Sie einen Schlüssel an POS1 und beenden Sie ihn an POS2 (Ursprung 1).

POS ist F [.C] [OPTS], wobei F die Feldnummer und C die Zeichenposition im Feld ist. OPTS ist eine oder mehrere Einzelbuchstaben-Bestelloptionen, die die globalen Bestelloptionen für diesen Schlüssel überschreiben. Wenn kein Schlüssel angegeben ist, verwenden Sie die gesamte Zeile als Schlüssel.

-t, --field-separator = SEP

Verwenden Sie SEP anstelle des Übergangs von nicht leer zu leer

John Kugelman
quelle
2
Seien Sie nur ein wenig vorsichtig, --field-separator=','wenn Sie möglicherweise einen Dateneingabeoperator haben, der Werte für "Vorname" wie "Billy Bob" oder was auch immer eingibt ... Leerzeichen können leicht in Ihre Daten gelangen, wenn Sie sich nicht dagegen schützen, aber Kommas sind relativ unwahrscheinlich.
Tony Delroy
1
Es gibt sehr wahrscheinlich Fälle von Kommas in diesen Bereichen, wie "Smith, Jr." oder "McDowell, Sr." oder "Dr. John" oder "New York, NY"
jbnunn
2
Beachten Sie, dass Sie die -bOption verwenden müssen, wenn die Spalten visuell ausgerichtet sind, dh zwischen den einzelnen Feldern eine nicht konstante Anzahl von Leerzeichen vorhanden ist . Dies liegt daran, sortdass tatsächlich berücksichtigt wird, dass die zu sortierende Zeichenfolge direkt nach dem Komma beginnt und nicht ab dem ersten Buchstaben der Spalte. Außerdem müssen Sie dem Befehl möglicherweise ein Präfix voranstellen LC_ALL=C, um Nebenwirkungen aufgrund des Gebietsschemas zu vermeiden, die selbst bei einer einfachen ASCII-Datei auftreten können.
Calandoa
@calandoa Danke für den Teil auf -b( --ignore-leading-blanks). Um ein bisschen zu verdeutlichen: echo -e 'aa<SPACE>a\na<SPACE><SPACE>b' | sort -k2gibt a<SPACE><SPACE>bzuerst (die zweite Spalte beginnt nach der ersten non-blank to blank transitionund <SPACE><SPACE>bist vorher <SPACE>a), aber mit -bgibt es aa<SPACE>awie erwartet ( aist vorher b).
Kirill Bulygin
7

Nur nach zweitem Feld sortieren (wenn also zweite Felder übereinstimmen, bleiben die Zeilen mit Übereinstimmungen in der Reihenfolge, in der sie im Original sind, ohne nach anderen Feldern zu sortieren):

sort -k 2,2 -s orig_file > sorted_file
Cian
quelle
3

FWIW, hier ist eine Sortiermethode, um zu zeigen, welche Prozesse den virtuellsten Speicher verwenden.

memstat | sort -k 1 -t':' -g -r | less

Die Sortieroptionen werden auf die erste Spalte gesetzt, wobei Folgendes verwendet wird: als Spaltentrenner, numerische Sortierung und umgekehrte Sortierung.

Netskink
quelle
2

sort -nk2 file.txt

Dementsprechend können Sie die Spaltennummer ändern.

Dheeraj Kumar
quelle