Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

sort et première ligne

Aucune réponse
Avatar
Marc Boyer
Bonjour,

j'ai un fichier de données, avec une première ligne d'en-tête. J'aimerais
trier le fichier, sauf la première ligne. Et je ne trouve pas de façon
élégante de le faire.

Je peux supprimer la première ligne, mais je ne trouve pas de façon
élégante de la remettre ensuite... Je sais faire un script qui sauvera
dans une variable la première ligne, fera le tri, remettra la ligne,
mais bon, c'est un peu lourd...

sed 1d toto.csv | sort > toto-sorted.csv

--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet

10 réponses

1 2 3
Avatar
Paul Gaborit
À (at) Fri, 22 Jun 2012 09:29:49 +0000 (UTC),
Marc Boyer écrivait (wrote):

j'ai un fichier de données, avec une première ligne d'en-tête.



Quelle drôle d'idée ! ;-)

J'aimerais trier le fichier, sauf la première ligne. Et je ne trouve
pas de façon élégante de le faire.

Je peux supprimer la première ligne, mais je ne trouve pas de façon
élégante de la remettre ensuite... Je sais faire un script qui sauvera
dans une variable la première ligne, fera le tri, remettra la ligne,
mais bon, c'est un peu lourd...



Je laisse à d'autres le soin d'imaginer des solutions "plus élégantes"
car la méthode par variable me semble tout à fait adaptée.

sed 1d toto.csv | sort > toto-sorted.csv



Attention : les enregistrements d'un fichier csv ne sont pas
nécessairement constitués d'une seule ligne. Pour traiter correctement
des fichiers CSV, je vous conseille fortement d'utiliser des modules
conçus pour cela (en Perl, c'est Text::CSV mais l'équivalent en Python
ou Ruby existe aussi).

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Avatar
Damien Wyart
* Marc Boyer in fr.comp.os.unix:
j'ai un fichier de données, avec une première ligne d'en-tête.
J'aimerais trier le fichier, sauf la première ligne. Et je ne trouve
pas de façon élégante de le faire.



Comme indiqué par Paul, attention, si c'est du CSV, il peut y avoir des
pièges.

Ceci dit, pour répondre à la question :

cat fichier | (read -r; printf "%sn" "$REPLY"; sort)

ou

cat fichier | perl -e 'print scalar (<>); print sort <>'

si on a perl (en précisant le tri si besoin).

--
DW
Avatar
Marc Boyer
Le 22-06-2012, Paul Gaborit a écrit :

À (at) Fri, 22 Jun 2012 09:29:49 +0000 (UTC),
Marc Boyer écrivait (wrote):
J'aimerais trier le fichier, sauf la première ligne. Et je ne trouve
pas de façon élégante de le faire.

Je peux supprimer la première ligne, mais je ne trouve pas de façon
élégante de la remettre ensuite... Je sais faire un script qui sauvera
dans une variable la première ligne, fera le tri, remettra la ligne,
mais bon, c'est un peu lourd...



Je laisse à d'autres le soin d'imaginer des solutions "plus élégantes"
car la méthode par variable me semble tout à fait adaptée.



Dommage.

sed 1d toto.csv | sort > toto-sorted.csv



Attention : les enregistrements d'un fichier csv ne sont pas
nécessairement constitués d'une seule ligne. Pour traiter correctement
des fichiers CSV, je vous conseille fortement d'utiliser des modules
conçus pour cela (en Perl, c'est Text::CSV mais l'équivalent en Python
ou Ruby existe aussi).



Pourtant, la RFC 4180 commence par:
1. Each record is located on a separate line, delimited by a line
break (CRLF). For example:

Ceci dit, dans les fichiers que je manipule là, il n'y a bien
que des données rangées par ligne.

Et puis bon, l'usage de modules spécifiques, le jour où il faudra
maintenir, il faudra que je relise la doc. La sémantique de
sort, head & cat, elle est stable.

Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Avatar
Jean-Marc Bourguet
Paul Gaborit writes:

Attention : les enregistrements d'un fichier csv ne sont pas
nécessairement constitués d'une seule ligne.



En partant de CSV, quelqu'un a-t'il une idee de pourquoi il n'y a pas de
version de awk parsant ce format qui semble lui convenir comme un gant?

A+

--
Jean-Marc, appliquant la bonne vieille methode, affirmons sans preuve,
Usenet dementira si c'est faux
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Emmanuel Florac
Le Fri, 22 Jun 2012 13:06:37 +0200, Damien Wyart a écrit:

cat fichier | perl -e 'print scalar (<>); print sort <>'




et un UUOC de la plus belle eau :) Plus simplement

perl -e '....' fichier

--
a script is what you give the actors, a program is what you give the
audience.
Ada Lovelace according to Larry Wall
Avatar
Marc Boyer
Le 22-06-2012, Marc Boyer a écrit :
Bonjour,

j'ai un fichier de données, avec une première ligne d'en-tête. J'aimerais
trier le fichier, sauf la première ligne. Et je ne trouve pas de façon
élégante de le faire.

Je peux supprimer la première ligne, mais je ne trouve pas de façon
élégante de la remettre ensuite... Je sais faire un script qui sauvera
dans une variable la première ligne, fera le tri, remettra la ligne,
mais bon, c'est un peu lourd...



Fallait juste réfléchir:
{ head -1 toto.csv && sed 1d toto.csv | sort }

Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Avatar
Damien Wyart
> cat fichier | perl -e 'print scalar (<>); print sort <>'



* Emmanuel Florac in fr.comp.os.unix:
et un UUOC de la plus belle eau :) Plus simplement



;-)

Et m... zut ! J'ai essayé de l'éviter sur la première forme (sans perl),
sans succès (read -u prend un fd, ce qui alourdit les choses), et du
coup j'ai copié-collé pour la version perl. Désolé !

perl -e '....' fichier



En effet ; le pire c'est que j'ai ai pensé mais seulement pour la
version shell :)

--
DW
Avatar
Paul Gaborit
À (at) Fri, 22 Jun 2012 11:07:26 +0000 (UTC),
Marc Boyer écrivait (wrote):

Le 22-06-2012, Paul Gaborit a écrit :
Attention : les enregistrements d'un fichier csv ne sont pas
nécessairement constitués d'une seule ligne. Pour traiter correctement
des fichiers CSV, je vous conseille fortement d'utiliser des modules
conçus pour cela (en Perl, c'est Text::CSV mais l'équivalent en Python
ou Ruby existe aussi).



Pourtant, la RFC 4180 commence par:
1. Each record is located on a separate line, delimited by a line
break (CRLF). For example:



Lisez la suite :

6. Fields containing line breaks (CRLF), double quotes, and commas
should be enclosed in double-quotes. For example:

"aaa","b CRLF
bb","ccc" CRLF
zzz,yyy,xxx

Ceci dit, dans les fichiers que je manipule là, il n'y a bien
que des données rangées par ligne.



Ça dépend de la source...

Et puis bon, l'usage de modules spécifiques, le jour où il faudra
maintenir, il faudra que je relise la doc. La sémantique de
sort, head & cat, elle est stable.



Syndrome NIH ? ;-)

Personnellement, je préfère nettement un module externe, bien documenté,
mis à jour régulièrement et debuggué par des milliers d'utilisateurs à
travers le monde plutôt qu'un truc fait en interne, souvent pas
documenté et reposant sur plein de présupposés connus lors de la
conception mais oubliés lors de l'évolution suivante...

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Avatar
Marc Boyer
Le 22-06-2012, Paul Gaborit a écrit :
Lisez la suite :

6. Fields containing line breaks (CRLF), double quotes, and commas
should be enclosed in double-quotes. For example:

"aaa","b CRLF
bb","ccc" CRLF
zzz,yyy,xxx

Ceci dit, dans les fichiers que je manipule là, il n'y a bien
que des données rangées par ligne.



Ça dépend de la source...



Je connais bien la source ;-)

Et puis bon, l'usage de modules spécifiques, le jour où il faudra
maintenir, il faudra que je relise la doc. La sémantique de
sort, head & cat, elle est stable.



Syndrome NIH ? ;-)



Non, plutôt un syndrome KISS.
Tient, il y a 2mn, je viens de croiser un collègue qui m'a expliqué
de pas pouvoir utiliser un script python car j'y utilise une feature 2.7.
En regardant python csv, je vois d'ailleurs que la sémantique a changé
entre 2.4 et 2.5 (d'ailleurs sur la question des sauts de ligne).
Alors que sort, head et cat, ils commencent à être assez stables.

Personnellement, je préfère nettement un module externe, bien documenté,
mis à jour régulièrement et debuggué par des milliers d'utilisateurs à
travers le monde plutôt qu'un truc fait en interne, souvent pas
documenté et reposant sur plein de présupposés connus lors de la
conception mais oubliés lors de l'évolution suivante...



Chaque règle est un subtil compromis entre des contraintes
externes, dont les poids relatifs peuvent varier.

En l'occurence, vu que le format d'entrée n'est pas un vrai .csv
(il plante lamentablement si on met des "), et que le dit format
évolue régulièrement en fonction des releases, je vais pas
essayer de prendre quelques heures à comprendre comment
python::csv fonctionne, comment on trie, alors qu'une solution
standart stable d'une ligne donne toute satisfaction.

Je fais pas un outil pour un utilisateur externe,
mais juste parce que j'ai la flemme d'ouvrir 25x OpenOffice,
de faire 25 copier/coller pour faire une moyenne sur 25
jeux de tests.

Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Avatar
Marc Boyer
Le 22-06-2012, Jean-Marc Bourguet a écrit :
Paul Gaborit writes:

Attention : les enregistrements d'un fichier csv ne sont pas
nécessairement constitués d'une seule ligne.



En partant de CSV, quelqu'un a-t'il une idee de pourquoi il n'y a pas de
version de awk parsant ce format qui semble lui convenir comme un gant?



Je n'ai pas d'info particulière.
Disons que dans la version simple, sans , ou CRLF entre ", c'est trop simple
awk -F ""*,"*" (trouvé sur le web, pas testé)
Mais si on a des champs du type
"Data1", "Data 2, avec des
bizzareries dedans, des quotes "" en plus", Data3
Ca devient plus coton... Formellement parlant, je soupsonne qu'on
soit pas dans la même classe de langages (mais c'est loin pour moi...)

Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
1 2 3