2009-08-31 16:20:22 +0000 2009-08-31 16:20:22 +0000
48
48

Wie kann man unter UNIX nur nach einer Spalte sortieren?

Ich weiß, dass die Option -k für das Unix-Programm sort uns erlaubt, nach einer bestimmten Spalte zu sortieren und nach allen folgenden. Zum Beispiel, gegeben die Eingabedatei:

2 3
2 2
1 2
2 1
1 1

Mit sort -n -k 1 erhalte ich eine Ausgabe, die nach der 1. Spalte und dann nach der 2. sortiert ist:

1 1
1 2
2 1
2 2
2 3

Ich möchte jedoch die Reihenfolge der 2. Spalte beibehalten, etwa so:

1 2
1 1
2 3
2 2
2 1

Ist dies mit dem Befehl sort möglich?

Antworten (3)

68
68
68
2009-08-31 16:28:27 +0000

Versuchen Sie dies:

sort -s -n -k 1,1

Das -s deaktiviert die “Last-Resort”-Sortierung, die nach allem sortiert, was nicht Teil eines angegebenen Schlüssels war.

Das -k 1 bedeutet im Kontext der numerischen Sortierung nicht wirklich “dieses Feld und alle folgenden”, wie Sie sehen können, wenn Sie versuchen, nach der zweiten Spalte zu sortieren. Sie sehen lediglich, dass die Gleichheit gebrochen wird, wenn Sie zum Rest der Zeile gehen. Im Allgemeinen müssen Sie jedoch -k 1,1 angeben, um nur nach Feld eins zu sortieren.

10
10
10
2012-10-16 13:59:28 +0000

Um nur nach der ersten Spalte zu sortieren, sollten Sie Folgendes tun:

sort -n -s -k1,1

Aus Unix and Linux System Administration Handbook

sort akzeptiert die Schlüsselspezifikation -k3 (anstelle von -k3,3), aber es tut wahrscheinlich nicht das, was Sie erwarten. Ohne die abschließende Feldnummer wird der Sortierschlüssel bis zum Ende der Zeile fortgesetzt

2
2
2
2016-12-30 17:47:12 +0000

Keine der angebotenen Antworten funktioniert bei mir generell.

Sowohl sort -s -k 2 file1 als auch sort -n -k1,1 machen eine zusätzliche Sortierung mit dieser Datei:

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

Ich musste genau das tun und habe am Ende eine Shell-Schleife verwendet. Diese Lösung funktioniert möglicherweise nicht gut bei einer sehr großen Datei, da die gesamte Datei für jeden einzelnen Wert in der sortierten Spalte gelesen werden muss.

Hier wird die Datei nur nach Spalte 2 sortiert.

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7