Ich versuche, einige einfache, durch Pipes getrennte Daten zu sortieren. Sort ist jedoch nicht wirklich sortieren. Es verschiebt meine Kopfzeile nach unten, aber meine zwei mit 241 beginnenden Zeilen werden durch eine mit 24 beginnende Zeile geteilt.
cat sort_fail.csv
column_a|column_b|column_c
241|212|20810378
24|121|2810172
241|213|20810376
sort sort_fail.csv
241|212|20810378
24|121|2810172
241|213|20810376
column_a|column_b|column_c
Die Spaltenüberschriften werden an den unteren Rand der Datei verschoben, sodass die Sortierung diese eindeutig verarbeitet. Die tatsächlichen Werte werden jedoch nicht wie erwartet sortiert.
In diesem Fall habe ich damit herumgearbeitet
sort sort_fail.csv --field-separator='|' -k1,1
Aber ich denke, das sollte nicht nötig sein. Warum wird nicht sortiert?
LC_COLLATE=C sort
. Je nachdem, was Sie erwarten, benötigen Sie möglicherweise auchLC_COLLATE=C sort -t'|' -n
csvsort
auscsvkit
, die Werte Griffe richtig zitiert.Antworten:
sort
Da das Gebietsschema berücksichtigt wird, erhalten Sie abhängig von Ihrer LC_COLLATE-Einstellung (die von LANG geerbt wird) möglicherweise unterschiedliche Ergebnisse:Dies kann zu Problemen in Skripten führen, da Sie möglicherweise nicht wissen, auf welches Gebietsschema das aufrufende Gebietsschema festgelegt ist, und daher möglicherweise unterschiedliche Ergebnisse erzielen.
Es ist nicht ungewöhnlich, dass Skripte die erforderlichen Einstellungen erzwingen
z.B
Das Interessante hier ist, dass die
|
Figur seltsam aussieht.Aber das liegt daran, dass die von ISO abgeleitete Standardregel für en_US lautet
Das bedeutet, dass das
|
Zeichen ignoriert wird und die Sortierreihenfolge so ist, als ob das Zeichen nicht existiert.Und das entspricht der "unerwarteten" Sortierung, die Sie sehen.
Die Umgehungsmöglichkeiten bestehen darin
-n
, numerische Sortierungen zu erzwingen oder das Feldtrennzeichen zu verwenden (wie Sie es getan haben) oder dasC
Gebietsschema zu verwenden.quelle
--debug
Option, die den (unterstrichenen) Schlüssel angibt, der zum Vergleichen verwendet wirdsort
die gesamte Zeile verwendet wird, anstatt bei Zeichen anzuhalten, von denen wir annehmen , dass dies der Fall ist.Was mich irritiert ist, dass sich das
24
nicht von seinem Platz zwischen den beiden bewegt241
. Das zweite Feld beginnt mit einem1
. Versucht man die Sortierung mit einem Anführungszeichen4
im zweiten Feld, wird das24
nach unten verschoben, weshalb ich den Verdacht habe, dassort
einfach zu ignorieren,|
sofern nicht anders angegeben. Versuchen Siesort -n
...quelle
-n, --numeric-sort vergleiche nach dem Zahlenwert der Zeichenkette
Ohne das -n steht 210 by text vor 23, wenn es um mein Zeichen geht.
quelle