J'essaie de trier quelques données simples délimitées par des tuyaux. Cependant, le tri n'est pas réellement un tri. Il déplace ma ligne d'en-tête vers le bas, mais mes deux lignes commençant par 241 sont divisées par une ligne commençant par 24.
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
Les en-têtes de colonne sont déplacés vers le bas du fichier, donc le tri est clairement en train de le traiter. Mais, les valeurs réelles ne sont pas triées comme je m'y attendais.
Dans ce cas, j'ai travaillé avec
sort sort_fail.csv --field-separator='|' -k1,1
Mais je pense que cela ne devrait pas être nécessaire. Pourquoi le tri n'est-il pas le tri?
LC_COLLATE=C sort
. Selon ce à quoi vous vous attendez, vous devrez peut-être aussiLC_COLLATE=C sort -t'|' -n
csvsort
partircsvkit
desquelles vous pouvez utiliser , qui gèrent correctement les valeurs entre guillemets.Réponses:
sort
est sensible aux paramètres régionaux, donc en fonction de votre paramètre LC_COLLATE (hérité de LANG), vous pouvez obtenir des résultats différents:Cela peut provoquer des problèmes dans les scripts, car vous ne savez peut-être pas à quoi les paramètres régionaux d'appel sont définis et vous pouvez donc obtenir des résultats différents.
Il n'est pas rare que les scripts forcent le réglage nécessaire
par exemple
Maintenant, ce qui est intéressant, ici, c'est que le
|
personnage a l'air bizarre.Mais c'est parce que la règle par défaut pour en_US, qui dérive de l'ISO, dit
Ce qui signifie que le
|
caractère est ignoré et l'ordre de tri serait comme si le caractère n'existait pas.Et cela correspond au tri "inattendu" que vous voyez.
Les solutions sont d'utiliser
-n
(pour forcer les tris numériques), ou d'utiliser le séparateur de champs (comme vous l'avez fait) ou d'utiliser lesC
paramètres régionaux.la source
--debug
option, qui indique la clé (soulignée) utilisée pour comparersort
la ligne entière est utilisée au lieu de s'arrêter aux caractères que nous supposons.Ce qui m'irrite, c'est que le
24
ne bouge pas de sa place entre les deux241
. Le deuxième champ commence par un1
. En essayant le tri avec un leader4
dans le deuxième champ, le24
est déplacé vers le bas, donc je soupçonnesort
simplement d'ignorer le|
sauf indication contraire. Essayezsort -n
...la source
-n, --numeric-sort comparer en fonction de la valeur numérique de la chaîne
Sans le -n, 210 par texte est en avance sur 23 car il va caractère mon caractère.
la source