sort
fournit deux types de tri numérique. Ceci provient de la page de manuel:
-g, --general-numeric-sort
compare according to general numerical value
-n, --numeric-sort
compare according to string numerical value
Quelle est la différence?
sort
n'est pas laman
page mais lainfo
page (info sort
).Réponses:
Le tri numérique général compare les nombres sous forme de flottants, cela permet la notation scientifique, par exemple 1.234E10, mais est plus lent et sujet à une erreur d'arrondi (1.2345678 pourrait venir après 1.2345679), le tri numérique est juste un tri alphabétique régulier qui sait que 10 vient après 9.
Voir http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html
la source
-k3.2n
ou-k3.2g
, c'est un triR10
avantR2
. Le tri est lexicographique et non numérique. Je m'attends à ce qu'il traite le champ à partir du deuxième caractère comme un nombre.sort
clés de @Kaz: sont vraiment byzantins - en bref: le ou les blancs précédant le champ sont considérés comme faisant partie du champ , donc char. l'index 1 pointe vers le (premier) blanc précédant le champ, pas le premier caractère réel du champ. Suffixez le caractère. index avecb
pour résoudre ce problème, c'est-à-dire:-k 3.2bn,3
(notez que l' option globale-b
ne fonctionne pas dans ce cas). Notez également l'ajout,3
, qui garantit que seul le troisième champ est utilisé - sans ce deuxième index de champ, le reste de la ligne entière est utilisé.Vous devez faire attention à vos paramètres régionaux. Par exemple, vous pourriez avoir l'intention de trier un nombre flottant (comme 2.2) alors que vos paramètres régionaux peuvent s'attendre à l'utilisation d'une virgule (comme 2,2).
Comme indiqué dans ce forum , vous pouvez avoir des résultats erronés en utilisant les indicateurs -n ou -g.
Dans mon cas, j'utilise:
afin de trier la 6ème colonne qui contient:
afin d'obtenir
la source
-n
à reconnaître la virgule comme séparateur de milliers - «1 000» est traité de la même façon que «1».sort
utilise la logique du préfixe le plus long: la partie la plus longue de la ligne / clé qu'il reconnaît comme un nombre est utilisée; dans un environnement local qui utilise.
comme caractère de base, la lecture s'arrêtera à,
.LC_ALL=C
est en effet le choix le plus robuste ; cependant, si vousLC_ALL
ne pariez pas,LANG=C
cela fonctionnera aussi.LANG=C sort -k 6,6n file
est à la fois plus simple et localise également l'effet de la définition de la variable d'environnementLANG
sur la commande spécifique.En plus de la réponse acceptée qui mentionne
-g
autoriser la notation scientifique , je veux montrer la partie qui cause le plus vraisemblablement un comportement indésirable.Avec
-g
:Regardez les
zoo
trois choses importantes ici:La ligne commence par
NAN
(par exempleNana
etnani lol
) ou-INF
(un seul tiret, pas--INF
) se déplace vers la fin mais avant les chiffres. Tandis queINF
passer au dernier après les chiffres car cela signifie l'infini .Les
NAN
,INF
et-INF
sont insensibles à la casse .Les lignes ignorent toujours des espaces de part et d' autre
NAN
,INF
,-INF
(quel que soitLC_CTYPE
). D'autres alphabétiques peuvent ignorer les espaces de chaque côté en fonction de la localisationLC_COLLATE
(par exempleLC_COLLATE=fr_FR.UTF-8
ignorer maisLC_COLLATE=us_EN.UTF-8
pas ignorer).Donc, si vous triez des caractères alphanumériques arbitraires, vous ne voulez probablement pas
-g
. Si vous avez vraiment besoin d'une comparaison de notation scientifique avec-g
, vous voudrez probablement extraire des données alphabétiques et numériques et faire une comparaison séparément .Si vous n'avez besoin que d'un
1, -1
tri de nombres ordinaires (par exemple ) et que vous pensez que cela0x/E/+ sorting
n'est pas important, utilisez juste-n
assez:Soit
-g
ou-n
, soyez conscient de l' effet des paramètres régionaux . Vous voudrez peut-être spécifierLC_NUMERIC
queus_EN.UTF-8
pour éviter le tri fr_FR.UTF-8-
avec un nombre flottant a échoué :Avec
LC_NUMERIC=en_US.UTF-8
:Ou
LC_NUMERIC=us_EN.UTF-8
pour grouper+|-|space
avecalpha
:Vous voudrez probablement spécifier
locale
lors de l'utilisationsort
si vous voulez écrire un script portable.la source