Numerische Sortierung in einer durch Kommas getrennten Datei mit Unix


8

Ich habe eine durch Kommas getrennte Datei, die so aussieht:

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

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

Erwünschtes Ergebnis:

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

Wie erreiche ich das mit sort? Es scheint, als würden die Kommas wie Tausendertrennzeichen anstatt Trennzeichen behandelt, selbst wenn ich sie als solche bezeichne.

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 Verwenden von sort -t','gibt mir Folgendes:

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

Wenn sort -nich nach einer Zahl sortiere, sehe ich Folgendes:

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

Wie kann ich sort verwenden, um das gewünschte Ergebnis zu erzielen?

Bearbeitet, um hinzuzufügen: Dies ist für eine einmalige Operation zum Erstellen einer sortierten Liste von ungefähr 7 Millionen Zeilen vorgesehen, sodass Problemumgehungen oder andere unorthodoxe Methoden durchaus akzeptabel sind.


Die Beispiele, die ich hier sehe , scheinen die -tOption zu zeigen , ein Leerzeichen zwischen dem -tund dem Charakter zu haben
SeanC

Erster Gedanke - Schnitt verwenden. Es wird nur eine bestimmte Spalte basierend auf einem bestimmten Trennzeichen ausgewählt. Auch die Antwort von "Artem Ice" mit tr. Ich liebe tr. Ich bin zu faul, um das zu schreiben und zu testen. Prost!
Vorac

Antworten:


9

Dies ist sicherlich eine schmutzige Umgehung, aber ich habe einen Weg gefunden, dies zu tun, dank @ slhcks Tipp zu Gebietsschemas. Wenn eine bessere Antwort kommt, die für andere hilfreicher wäre, werde ich sie mit Sicherheit akzeptieren, da dies so ziemlich nur für mein spezifisches Problem funktioniert.

Ich habe das Gebietsschema auf Spanisch (Bolivianisch) gesetzt, damit die Kommas wie Dezimalstellen behandelt werden. Dann hat die standardmäßige numerische Sortierung den Trick getan.

$ 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

Ich hätte vorgeschlagen, ein deutsches Gebietsschema oder ähnliches zu verwenden. Ich kann mir momentan 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

@slhck Das scheint der Kern der meisten Probleme zu sein, an denen ich in UNIX hängen bleibe :) Vielen Dank für Ihre Hilfe, um mich zu einer Lösung zu bringen, unabhängig davon.
dpatchery

6

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

Es gibt jedoch eine Einschränkung: Wenn Ihre Sortierung nicht wie erwartet funktioniert, ist Ihre localeEinstellung wahrscheinlich anders als 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 dann Ihren sortBefehl erneut. 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, das ich leicht entfernen kann, wenn ich fertig bin? HMU im Chat, wenn mir jemand dabei helfen möchte ... Ich bin ganz der Unix-Neuling.
dpatchery

Ich bin mir ziemlich sicher, dass es nur ein localeProblem ist. Aber was ist sort --versioneigentlich für Sie?
Slhck

sort --version gibt mir ein illegales Argument. --Befehle haben in der Vergangenheit auch für mich nicht funktioniert. Ich habe die Manpage überprüft und es gibt keine explizit aufgerufene Version, aber es wird "HP-UX 11i Version 2: August 2003" aufgeführt, wenn dies überhaupt hilft. Meine LC_NUMERIC ist auf "C" gesetzt.
dpatchery

Das deutsche Gebietsschema würde ,beispielsweise als Dezimaltrennzeichen verwendet. Ich habe jedoch noch nie HP-UX verwendet.
Slhck

1

Versuchen Sie, die -gOption für die numerische Sortierung hinzuzufügen .

Versuchen:

sort -t',' -g <whatever>

Ist das nicht -nnumerische Sortierung? -g gibt mir eine illegale Option.
dpatchery

-gist die general-numeric-sortOption und sollte eigentlich in jeder neueren Version von verfügbar sein sort. @dpatchery
slhck

Dies ist an meinem Arbeitsplatz, so dass ich mit ziemlicher Sicherheit keine aktuelle Version habe :)
dpatchery

0

Ersetzen Sie den Begrenzer:

cat commafile | tr , " " | sort -n 

- Sollte dir helfen.

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.