Sortieren von Daten basierend auf der zweiten Spalte einer Datei


212

Ich habe eine Datei mit zwei Spalten und einer nAnzahl von Zeilen.

Spalte 1 enthält namesund Spalte2 age.

Ich möchte den Inhalt dieser Datei in aufsteigender Reihenfolge nach age(in der zweiten Spalte) sortieren .

Das Ergebnis sollte die nameder jüngsten Person zusammen mit nameund dann die zweitjüngste Person anzeigen und so weiter ...

Vorschläge für eine Einzeiler-Shell oder ein Bash-Skript.


Antworten:


329

Sie können den folgenden sortBefehl verwenden :

sort -k2 -n yourfile

-n, --numeric-sortvergleiche nach dem numerischen Wert der Zeichenfolge

Beispielsweise:

$ cat ages.txt 
Bob 12
Jane 48
Mark 3
Tashi 54

$ sort -k2 -n ages.txt 
Mark 3
Bob 12
Jane 48
Tashi 54

1
Beachten Sie auch, dass die Verwendung von -hanstelle von -ndurch Menschen lesbare Werte wie 2Goder 3Ksowie durch Kommas getrennte Zahlen 1,234.5
sortiert,

Problem mit "falscher" Bestellung. Achten Sie auf man "*** WARNUNG *** Das von der Umgebung angegebene Gebietsschema wirkt sich auf die Sortierreihenfolge aus. Legen Sie fest LC_ALL=C, dass die traditionelle Sortierreihenfolge mit nativen Bytewerten abgerufen wird." (für String Match Case ohne -n)
x'ES

Dies berücksichtigt keine Leerzeichen in der ersten Spalte und funktioniert auch nicht, wenn nach der zweiten Spalte mehr Spalten vorhanden sind, da -k bis zum Zeilenende gelesen wird. Angenommen, es ist eine TSV-Datei, dann ist eine bessere Lösungsort -t$'\t' -k2 -n FILE
tuxErrante

Möglicherweise müssen Sie Ihr Trennzeichen mit der Option -t angeben
Spektrum

85

Lösung:

sort -k 2 -n filename

ausführlicher geschrieben als:

sort --key 2 --numeric-sort filename


Beispiel:

$ cat filename
A 12
B 48
C 3

$ sort --key 2 --numeric-sort filename 
C 3
A 12
B 48

Erläuterung:

  • -k # - Dieses Argument gibt die erste Spalte an, die zum Sortieren verwendet wird. (Beachten Sie, dass die Spalte hier als durch Leerzeichen getrenntes Feld definiert ist. Das Argument -k5wird beginnend mit dem fünften Feld in jeder Zeile und nicht mit dem fünften Zeichen in jeder Zeile sortiert. )

  • -n - Diese Option gibt eine "numerische Sortierung" an, was bedeutet, dass die Spalte als Zahlenreihe anstelle von Text interpretiert werden soll.


Mehr:

Andere gängige Optionen sind:

  • -r - Diese Option kehrt die Sortierreihenfolge um. Es kann auch als --reverse geschrieben werden .
  • -i - Diese Option ignoriert nicht druckbare Zeichen. Es kann auch als --ignore-nonprinting geschrieben werden .
  • -b - Diese Option ignoriert führende Leerzeichen. Dies ist praktisch, da Leerzeichen zum Bestimmen der Anzahl der Zeilen verwendet werden. Es kann auch als --ignore-führende-Leerzeichen geschrieben werden .
  • -f - Diese Option ignoriert Groß- und Kleinschreibung. "A" == "a". Es kann auch als --ignore-case geschrieben werden .
  • -t [neues Trennzeichen] - Mit dieser Option wird für die Vorverarbeitung ein anderer Operator als Leerzeichen verwendet. Es kann auch als --field-separator geschrieben werden .

Es gibt andere Optionen, aber dies sind die häufigsten und hilfreichsten, die ich häufig verwende.


@Angelo Diese Antwort wurde vermutlich Jahre nachdem Sie eine Antwort auf diese Frage akzeptiert haben, veröffentlicht. Haben Sie sie jedoch als die neu akzeptierte Antwort angesehen?
Jonathan Y.

Option -twar realer Lebensretter !! Wenn Ihre Spalten Leerzeichen haben und sich die Spalten durch ein bestimmtes Zeichen wie ,oder eine Registerkarte unterscheiden
AKS

12

Für tabulatorgetrennte Werte kann der folgende Code verwendet werden

sort -t$'\t' -k2 -n

-r kann verwendet werden, um Daten in absteigender Reihenfolge abzurufen.
-n für die numerische Sortierung
-k, --key = POS1 [, POS2] wobei k die Spalte in der Datei ist.
In absteigender Reihenfolge ist der Code unten

sort -t$'\t' -k2 -rn

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.