it-swarm.com.de

GNU stabile Sortierung sortieren, wenn die Sortierung die Sortierreihenfolge nicht kennt

Ich habe eine zweispaltige Datei; Die Datei ist bereits in Spalte 1 so sortiert, wie ich es möchte. Ich möchte nach Spalte 2 innerhalb jeder Kategorie von Spalte 1 sortieren. sort versteht jedoch die Sortierreihenfolge von Spalte 1 nicht.

Der normale Weg (von ähnlichen Fragen hier auf dem Stapel) wäre folgender:

sort --stable -k1,1 -k2,2n

Aber ich kann die Sortierung auf k1 nicht angeben, weil sie willkürlich ist.

Beispieleingabe:

C 2
C 1
A 2
A 1
B 2 
B 1

und Ausgabe:

C 1
C 2
A 1
A 2
B 1 
B 2
18
Evan Benn

Sie können awk verwenden, um für jeden Block eine neue Sortierung zu starten:

% awk -v cmd="sort -k2,2" '$1 != prev {close(cmd); prev=$1} {print | cmd}' foo
C 1
C 2
A 1
A 2
B 1
B 2
  • $1 != prev {close(cmd); prev=$1} - Wenn der gespeicherte Wert unterschiedlich ist, haben wir einen neuen Block, sodass wir alle zuvor gestarteten sort schließen
  • {print | "sort -k2,2"}' Leitet die Ausgabe an sort und startet sie, wenn sie noch nicht ausgeführt wird (awk kann die gestarteten Befehle verfolgen).
20
muru

Sie könnten eine Schwartzsche Transformation verwenden (dies ist im Grunde der Ansatz, auf den Sie in einem Kommentar angespielt haben, aber wahrscheinlich performanter als murusfeine Antwort) aufgrund der Verwendung eines einzelnen sort -Aufrufs im Gegensatz zu mehreren) - Fügen Sie mit awk eine Präfixspalte hinzu, die mit einer Wertänderung in der ersten Spalte inkrementiert wird, und sortieren Sie nach der Präfixspalte gefolgt von der "zweiten" Spalte (deren Ordnungsposition sich aufgrund des Vorhandenseins der Präfixspalte vorübergehend auf 3 verschoben hat) und schließlich Entfernen Sie die Präfixspalte

awk '{print ($1 in a? c+0: ++c)"\t" $0; a[$1]}' file | sort -k1,1n  -k3,3 | cut -f 2-
12
iruvar