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.