Ich habe eine CSV-Datei und möchte sie nach Spaltenpriorität sortieren, z. B. "Sortieren nach". Beispielsweise:
3;1;2
1;3;2
1;2;3
2;3;1
2;1;3
3;2;1
Wenn diese Situation das Ergebnis einer "Auswahl" wäre, wäre die "Reihenfolge nach" wie folgt: Reihenfolge nach Spalte2, Spalte1, Spalte3 - das Ergebnis wäre:
2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
Ich würde gerne wissen, wie man dasselbe Ergebnis mit dem Befehl "sort" unter Unix erzielt.
unix
sorting
csv
sql-order-by
Rafael Orágio
quelle
quelle
Antworten:
quelle
-n
Option verwenden, die "nach dem numerischen Wert der Zeichenfolge vergleichen" oder die-g
Option "nach dem allgemeinen numerischen Wert vergleichen". Bei einem Zeichenfolgenvergleich numerischer Werte werden die Zahlen wie folgt sortiert1,10,2,20
. Zumindest sind dies Optionen, die in meiner Sortierversion unter CentOS verfügbar sind. Sie sollten anhand der Manpage überprüfen, welche Optionen in Ihrer Sortierversion korrekt sind.sort: stray character in field spec: invalid field specification ‘2,1,3’
sort --field-separator=',' -r -k3 -k1 -k2 source.csv > target.csv
für mich gearbeitet.sort --field-separator=';' --key={2,1,3}
. Dies funktionierteGNU coreutils 8.4
ab April 2016Angenommen, Sie haben eine weitere Zeile
3;10;3
in Ihrerunsorted.csv
Datei. Dann erwarten Sie vermutlich ein numerisch sortiertes Ergebnis:und nicht alphabetisch sortiert:
Um das zu bekommen, müssen Sie verwenden
-n
:Es ist erwähnenswert, dass
2,2
verwendet werden muss. Wenn nur2
verwendet wird,sort
wird die Zeichenfolge vom Anfang von Feld 2 bis zum Ende übernommen.2,2
stellt sicher, dass nur das Feld2
verwendet wird.quelle
3;10;3
,3:10:5
,3:10;2
,3;10;3
in dieser Reihenfolge in der Quelldatei, und bei der Verwendung nur-k 2,2
auf Spalte 2 und 3. Die Manpage sagt zu sortieren erscheint"The -k option may be specified multiple times, in which case subsequent keys are compared when earlier keys compare equal."
. In meinem Fall war der frühere Schlüssel (Wert = 10) gleich, ich habe ihn jedoch nicht-k
mehrmals angegeben. Ich bin nicht sicher, ob dies ein zuverlässiges Verhalten ist oder mit meinem System (Mac) zusammenhängt. Letztendlich spielt es jedoch keine Rolle, solange die primäre Sortierung korrekt ist.-s
stabile Sorte, die die gleichen Schlüssel ignoriert, die laut Mann anscheinend schneller ist.Charlies Antwort oben hat bei Cygwin (Sortierversion 2.0, GNU-Textutils) bei mir nicht funktioniert. Folgendes hat funktioniert:
quelle
sort --field-separator=';' -k2 -k1 -k3 test.csv
..und wenn jemand der 'Sortier'-Lösung gefolgt ist, aber jetzt mehr als den einzelnen eindeutigen Eintrag pro Zeile (dh die oberste X-Anzahl von eindeutigen Einträgen) erhalten möchte, können Sie die Datei verwenden, sobald Sie sie mit' sortieren 'sortiert haben eine kleine App, die ich hier erstellt habe:
https://github.com/danieliversen/MiscStuff/blob/master/scripts/findTopUniques.java
quelle
cat unsorted-file | sort | uniq | head -X
- wannX
ist die Anzahl der ersten Zeilen, die Sie ausgeben möchten.uniq
zwischensort
und und in der Reihenfolge der Pipeshead
, der allen sortierten Zeilen unmittelbar vor dem Extrahieren der obersten Zeilen eine Eindeutigkeit verleiht.