web-dev-qa-db-fra.com

Quelle est la différence entre les options --general-numeric-sort et --numeric-sort dans le tri gnu

sort fournit deux types de tri numérique. C'est 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?

106
Trenton

Le tri numérique général compare les nombres sous forme de flottants, ce qui 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

‘-G’ ‘--general-numeric-sort’ ‘--sort = general-numeric’ Tri numérique, en utilisant la fonction C standard strtod pour convertir un préfixe de chaque ligne en un nombre à virgule flottante double précision. Cela permet de spécifier des nombres à virgule flottante en notation scientifique, comme 1.0e-34 et 10e100. Les paramètres régionaux LC_NUMERIC déterminent le caractère à virgule décimale. Ne signalez pas les erreurs de dépassement, de dépassement ou de conversion. Utilisez la séquence de classement suivante: Lignes qui ne commencent pas par des nombres (tous considérés comme égaux). NaN (valeurs "pas un nombre", dans l'arithmétique à virgule flottante IEEE) dans un ordre cohérent mais dépendant de la machine. Moins l'infini. Nombres finis dans l'ordre numérique croissant (avec -0 et +0 égaux). Plus l'infini.

N'utilisez cette option que s'il n'y a pas d'alternative; il est beaucoup plus lent que --numeric-sort (-n) et il peut perdre des informations lors de la conversion en virgule flottante.

"-N" "--numeric-sort" "--sort = numeric" Trier numériquement. Le numéro commence chaque ligne et se compose de blancs facultatifs, d'un signe "-" facultatif et de zéro ou plusieurs chiffres éventuellement séparés par des milliers de séparateurs, éventuellement suivis d'un caractère décimal et de zéro ou plusieurs chiffres. Un nombre vide est traité comme "0". Les paramètres régionaux LC_NUMERIC spécifient le caractère à virgule décimale et le séparateur de milliers. Par défaut, un espace est un espace ou une tabulation, mais les paramètres régionaux LC_CTYPE peuvent changer cela.

La comparaison est exacte; il n'y a pas d'erreur d'arrondi.

Ni une notation "+" ni une notation exponentielle n’est reconnue. Pour comparer ces chaînes numériquement, utilisez l'option --general-numeric-sort (-g).

81
Martin Beckett

Vous devez être prudent avec vos paramètres régionaux. Par exemple, vous pourriez avoir l'intention de trier un nombre flottant (comme 2.2) tandis que votre environnement local peut 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 drapeaux -n ou -g.

Dans mon cas, j'utilise:

LC_ALL=C sort -k 6,6n file

afin de trier la 6ème colonne qui contient:

2.5
3.7
1.4

afin d'obtenir

1.4
2.5
3.7
10
JFL