Tri numérique dans un fichier délimité par des virgules avec Unix


8

J'ai un fichier séparé par des virgules qui ressemble à ceci:

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

Je veux utiliser sortpour trier ce fichier numériquement par la première colonne uniquement .

Résultat désiré:

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

Comment puis-je y parvenir en utilisant le tri? Il semble que les virgules soient traitées comme des milliers de séparateurs au lieu de délimiteurs, même lorsque je les appelle comme telles.

Les deux sort -t',' -net sort -t',' -nk1'donnez-moi ceci:

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

Trier par défaut (pas de paramètres) ou utiliser sort -t','me donne ceci:

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

Et le tri en nombre sort -nme donne ceci:

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

Comment puis-je utiliser le tri pour obtenir le résultat souhaité?

Modifié pour ajouter: il s'agit d'une opération ponctuelle pour créer une liste triée d'environ 7 millions de lignes, donc des solutions de contournement ou d'autres méthodes peu orthodoxes sont parfaitement acceptables.


les exemples que je vois ici semblent montrer l' -toption comme ayant un espace entre le -tet le caractère
SeanC

Première pensée - utilisez la coupe. Il sélectionne uniquement une colonne particulière, basée sur un séparateur donné. Aussi la réponse de "Artem Ice" avec tr. J'adore tr. Je suis cependant trop paresseux pour écrire et tester cela. À votre santé!
Vorac

Idem

Réponses:


9

C'est certainement une sale solution de contournement, mais j'ai trouvé un moyen de le faire grâce au conseil de @ slhck sur les paramètres régionaux. Si une meilleure réponse arrive qui serait plus utile aux autres, je l'accepterai certainement car cela ne fonctionne pratiquement que pour mon problème spécifique.

J'ai défini les paramètres régionaux sur espagnol (bolivien) pour que les virgules soient traitées comme des décimales, puis le tri numérique standard a fait l'affaire.

$ 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

Ah voyez, j'aurais suggéré d'utiliser une locale allemande ou similaire. Je ne peux penser à rien d'autre pour le moment sans pouvoir le tester ou quels outils vous avez disponibles, car il s'agit d'une version Unix assez rare.
slhck

@slhck Cela semble être le noeud de la plupart des problèmes sur lesquels je suis bloqué sous UNIX :) Merci pour votre aide, quelle que soit la solution.
dpatchery

6

GNU sortfait cela par défaut:

$ cat test
100,00869184
6492,8361
1234,31
200,04071

$ gsort -nt',' < test
100,00869184
200,04071
1234,31
6492,8361

Version:

$ gsort --version
sort (GNU coreutils) 8.19

Il y a cependant une mise en garde: si votre tri ne fonctionne pas comme prévu, votre localeparamètre est probablement différent de C. Pourquoi est-ce? localedéfinit le tri et l'interprétation des lettres, des chiffres, des caractères décimaux, etc.

Pour vérifier cela, entrez simplement localedans un terminal. Est-ce LC_NUMERICprêt en_US.UTF-8, peut-être? Cela expliquerait le mauvais ordre de tri. Réglez-le sur C:

export LC_NUMERIC=C

Ensuite, essayez à sortnouveau votre commande. Si vous souhaitez définir votre globale localeà C, faire avec:

export LC_ALL=C

Je n'ai pas accès à GNU dans mon environnement. Est-ce quelque chose que je pourrais facilement obtenir puis retirer une fois terminé? HMU dans le chat si quelqu'un veut m'aider à le faire ... Je suis tout à fait le débutant UNIX.
dpatchery

Je suis sûr que ce n'est qu'un localeproblème. Mais qu'en est-il sort --versionpour vous, en fait?
slhck

sort --version me donne un argument illégal. --les commandes n'ont pas fonctionné pour moi dans le passé non plus. J'ai vérifié la page de manuel et aucune version n'est indiquée explicitement, mais elle répertorie "HP-UX 11i version 2: août 2003" si cela vous aide. Mon LC_NUMERIC est réglé sur "C".
dpatchery

Les paramètres régionaux allemands, par exemple, seraient utilisés ,comme séparateur décimal. Je n'ai cependant jamais utilisé HP-UX.
slhck

1

Essayez d'ajouter l' -goption qui est supposée effectuer un tri numérique.

Essayer:

sort -t',' -g <whatever>

Le -ntri numérique n'est-il pas ? -g me donne une option illégale.
dpatchery

-gest l' general-numeric-sortoption et devrait être disponible dans toute version récente de sort. @dpatchery
slhck

C'est sur mon lieu de travail donc je n'ai certainement pas de version récente :)
dpatchery

0

Remplacez le délimètre:

cat commafile | tr , " " | sort -n 

- devrait vous aider.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.