Numerische Sortierung in einer durch Kommas getrennten Datei mit Unix

14501
dpatchery

Ich habe eine durch Kommas getrennte Datei, die folgendermaßen aussieht:

100,00869184 6492,8361 1234,31 200,04071 

Ich möchte sortdiese Datei numerisch nur nach der ersten Spalte sortieren .

Erwünschtes Ergebnis:

100,00869184 200,04071 1234,31 6492,8361 

Wie kann ich das mit sort erreichen? Es scheint, als würden die Kommas wie Trennzeichen anstelle von Trennzeichen behandelt, selbst wenn ich sie als solche ausrufe.

Beides sort -t',' -nund sort -t',' -nk1'gib mir das:

1234,31 200,04071 6492,8361 100,00869184 

Das Sortieren nach Standard (keine Parameter) oder Verwendung sort -t','gibt mir folgendes:

100,00869184 1234,31 200,04071 6492,8361 

Und das Sortieren nach einer Nummer sort -ngibt mir folgendes:

1234,31 200,04071 6492,8361 100,00869184 

Wie kann ich sort verwenden, um mein gewünschtes Ergebnis zu erzielen?

Zum Hinzufügen bearbeitet: Dies ist für eine einmalige Operation zum Erstellen einer sortierten Liste mit etwa 7 Millionen Zeilen gedacht. Daher sind Problemumgehungen oder andere unorthodoxe Methoden durchaus akzeptabel.

8
Die Beispiele, die ich hier (http://www.softpanorama.org/Tools/sort.shtml) sehe, scheinen die Option "-t" als ein Leerzeichen zwischen "-t" und dem Zeichen anzuzeigen SeanC vor 11 Jahren 0
Erster Gedanke - Schnitt verwenden. Es wählt nur eine bestimmte Spalte basierend auf einem bestimmten Trennzeichen aus. Auch die Antwort von "Artem Ice" mit tr. Ich liebe tr. Ich bin jedoch zu faul, dies zu schreiben und zu testen. Prost! Vorac vor 11 Jahren 0
Mögliches Gleiches für tab char: http://stackoverflow.com/questions/1037365/unix-sort-with-tab-delimiter Ciro Santilli 新疆改造中心 六四事件 法轮功 vor 9 Jahren 0

4 Antworten auf die Frage

9
dpatchery

This is certainly a dirty workaround, but I figured out a way to do this thanks to @slhck's tip about locales. If a better answer comes along that would be more helpful to others, I'll certainly accept it since this pretty much only works for my specific problem.

I set the locale to Spanish (Bolivian) so that the commas were treated like decimal points, then standard numeric sorting did the trick.

$ export LC_NUMERIC="es_BO.utf8" $ cat test.csv 100,00869184 6492,8361 1234,31 200,04071 $ sort -n test.csv 100,00869184 200,04071 1234,31 6492,8361 
Ah, ich hätte vorgeschlagen, ein deutsches Gebietsschema oder ähnliches zu verwenden. Ich kann mir jetzt nichts anderes vorstellen, ohne es testen zu können oder welche Tools Sie zur Verfügung haben, da dies eine ziemlich seltene Unix-Version ist. slhck vor 11 Jahren 0
@slhck Das scheint der springende Punkt bei den meisten Problemen zu sein, die ich in UNIX bekomme :) Vielen Dank für Ihre Hilfe, die mich zu einer Lösung geführt haben. dpatchery vor 11 Jahren 0
6
slhck

GNU's sortmacht dies standardmäßig:

$ cat test 100,00869184 6492,8361 1234,31 200,04071  $ gsort -nt',' < test 100,00869184 200,04071 1234,31 6492,8361 

Ausführung:

$ gsort --version sort (GNU coreutils) 8.19 

Allerdings gibt es eine Einschränkung: Wenn Ihre Sortierung nicht wie erwartet funktioniert, ist Ihre localeEinstellung wahrscheinlich auf etwas anderes als eingestellt C. Warum ist das? localeDefiniert die Sortierung und Interpretation von Buchstaben, Zahlen, Dezimalzeichen usw.

Um dies zu überprüfen, geben Sie einfach localeein Terminal ein. Ist LC_NUMERICgesetzt en_US.UTF-8, vielleicht? Dies würde die falsche Sortierreihenfolge erklären. Setzen Sie es zurück auf C:

export LC_NUMERIC=C 

Versuchen Sie es dann sorterneut. Wenn Sie möchten, dass Ihre globale einstellen localezu C, tun dies mit:

export LC_ALL=C 
Ich habe in meiner Umgebung keinen Zugriff auf GNU. Ist es etwas, was ich leicht bekommen könnte, wenn ich fertig bin? HMU im Chat, wenn jemand mir dabei helfen möchte ... Ich bin schon ein UNIX-Neuling. dpatchery vor 11 Jahren 0
Ich bin mir ziemlich sicher, dass es sich nur um ein Gebietsschema handelt. Aber was ist für Sie die "Art - Version"? slhck vor 11 Jahren 0
Sort - Version gibt mir ein illegales Argument. Die Kommandos haben auch in der Vergangenheit nicht funktioniert. Ich habe die Manpage durchgesehen und es wurde keine explizite Version aufgerufen, aber es wird "HP-UX 11i Version 2: August 2003" aufgeführt, falls dies überhaupt hilft. Mein LC_NUMERIC ist auf "C" gesetzt. dpatchery vor 11 Jahren 0
Bei einem deutschen Gebietsschema würde zum Beispiel `,` als Dezimaltrennzeichen verwendet. Ich habe jedoch noch nie HP-UX verwendet. slhck vor 11 Jahren 0
1
HeatfanJohn

Fügen Sie die -gOption hinzu, die eine numerische Sortierung durchführen soll.

Versuchen:

sort -t',' -g <whatever> 
Ist '-n' keine numerische Sortierung? -g gibt mir eine illegale Option. dpatchery vor 11 Jahren 0
`-g` ist die 'general-numeric-sort'-Option und sollte in einer aktuellen Version von` sort` verfügbar sein. @Depatchery slhck vor 11 Jahren 0
Dies ist an meinem Arbeitsplatz, also habe ich fast definitiv keine aktuelle Version :) dpatchery vor 11 Jahren 0
0
defhlt

Ersetzen Sie das Delimeter:

cat commafile | tr, " " | sort -n 

- sollte dir helfen.