Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/09/2007, 16h51   #1
Membre du Club
 
Avatar de pseudobidon57
 
Inscription : octobre 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 133
Points : 65
Points : 65
Par défaut sed et expression reguliere

Bonjour, je travaille avec cygwin, et je suis un debutant de chez debutant pour les expression reguliere.. voila, j'ai un fichier csv classique, et je voudrais supprimer la colonne 2 et 5 avec sed..je m'approche de la solution avec sed:
mais ce code ne supprime dans ce cas que tout ce qu'il y a avant la troisieme virgule.. si quelqu'un pouvais m'aider ce serait super sympa.
Merci
__________________
Desole pour l'orthographe, mais il n'y a pas d'accent sur les claviers anglais..sniff...
pseudobidon57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2007, 19h08   #2
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 946
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 946
Points : 1 085
Points : 1 085
Cut est plus adapté pour ce genre de travail.

ou
Code :
cut -d',' --complement -f2,5
Dans ton code sed, la parenthèse indique : "tout, jusqu'à la première virgule". Et la répétition supprime donc tout, jusqu'à la 3e virgule. Je ne comprends pas trop ce que tu as voulu faire.

Bon, et comme tu demandais la solution en sed, voici plusieurs façons possibles :

Code :
1
2
3
4
sed -r 's/^([^,]*,)([^,]*,)([^,]*,)([^,]*,)([^,]*,)/\1\3\4/'
sed -r 's/[^,]*,//2; s/[^,]*,//4'
sed -r 's/,[^,]*//;s/[^,]*,//4'
sed -r 's/^([^,]*,)[^,]*,([^,]*,)([^,]*,)[^,]*,/\1\2\3/'
L'option -r permet d'utiliser les expressions rationnelles étendues. Cette option est pratique, car elle simplifie beaucoup le code et permet d'enlever beaucoup de backslash. Je recommande de l'utiliser en général, sauf quand la portabilité est nécessaire.
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2007, 12h17   #3
Membre du Club
 
Avatar de pseudobidon57
 
Inscription : octobre 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 133
Points : 65
Points : 65
Merci beaucoup, mais je precise que j'avais deja la solution en utilisant cut. mais cette solution est absolument inadaptee dans la mesure ou je dois effectuer ce traitement sur plusieurs fichiers dont certains font plusieurs go.
Le temps de traitement est beaucoup, beaucoup trop long..( plusieurs jours sur certains fichiers)
voila.

Merci beaucoup pour l'expression reguliere. a+
__________________
Desole pour l'orthographe, mais il n'y a pas d'accent sur les claviers anglais..sniff...
pseudobidon57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2007, 12h20   #4
Modérateur
 
Avatar de ggnore
 
Inscription : juillet 2004
Messages : 2 246
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : juillet 2004
Messages : 2 246
Points : 1 904
Points : 1 904
Pour des traitements lourds, il vaut mieux utiliser perl qui est plus véloce.
__________________
Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
ggnore est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2007, 12h30   #5
Membre du Club
 
Avatar de pseudobidon57
 
Inscription : octobre 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 133
Points : 65
Points : 65
si je pouvais oui, mais j'ai rien d'autre que cygwin, et a mon grand regret, je suis pas un pro du script unix, et encore moins des expressions regulieres..

Mais je demande qu'a apprendre..
__________________
Desole pour l'orthographe, mais il n'y a pas d'accent sur les claviers anglais..sniff...
pseudobidon57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2007, 12h39   #6
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 946
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 946
Points : 1 085
Points : 1 085
Citation:
Envoyé par pseudobidon57 Voir le message
Merci beaucoup, mais je precise que j'avais deja la solution en utilisant cut. mais cette solution est absolument inadaptee dans la mesure ou je dois effectuer ce traitement sur plusieurs fichiers dont certains font plusieurs go.
Et tu remarques une différence significative de vitesse entre cut et sed ? J'aurais pensé que cut allait plus vite pour faire ça.

Citation:
Pour des traitements lourds, il vaut mieux utiliser perl qui est plus véloce.
Et tu remarques une différence significative de vitesse entre sed et perl ? Là, c'est juste du remplacement... je ne pense pas que perl fasse vraiment mieux...
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2007, 12h57   #7
Membre du Club
 
Avatar de pseudobidon57
 
Inscription : octobre 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 133
Points : 65
Points : 65
oui, je remarque une difference tres significative entre cut et sed. mais mon probleme est en fait beaucoup plus complique que tel que je l'ai exposer.
en fait, j'ai un repertoire qui contient plusieurs fichiers csv.
De ces fichiers, je dois extraire certaine colonne (par exemple la col1, col4, col5)
les nombre de colonnes de chaque fichier est variable. ces information se trouve dans un fichier de configuration
qui se presente de la facon suivante:
report1.csv [1,4,5]
report2.csv [2,4,5,8]
report3.csv [4,7]
etc..
cela signifie que par exemple pour le fichier report1.csv je dois produire un nouveau fichier ou j'aurais extrais les colonnes 1, 4 et 5. pour le report2, les colonnes 2, 4, 5, et 8.
Ces fichier peuvent tous avoir un nombre de colonne different( par exemple report1.csv peut comporter 23 colonnes, et report2 en contenir 10.
donc je souhaite produire une expression reguliere parametree qui soit applicable a tout les cas.
Je galere, mais d'une force..
j'ai deja fait le script qui extrai l'indice de la colonne pour chaque rapport.
quelqu'un aurait une expression reguliere a me propose
__________________
Desole pour l'orthographe, mais il n'y a pas d'accent sur les claviers anglais..sniff...
pseudobidon57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2007, 13h07   #8
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 946
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 946
Points : 1 085
Points : 1 085
Avec sed, utilise la première expression rationnelle que j'ai donnée, c'est la plus simple à paramétrée, sauf si tu as plus de 10 colonnes (certains sed ne le gèrent pas).

Avec cut, ça aurait été assez simple à générer. Je suis surpris que ce soit si lent. Je ferai des tests.

Le plus simple est d'écrire un script sed qui génère la commande sed à exécuter.
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2007, 13h13   #9
Membre du Club
 
Avatar de pseudobidon57
 
Inscription : octobre 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 133
Points : 65
Points : 65
c'est tres tres lent avec cut, car je donis prendre chaque fichier ligne par ligne et avec un cut parametree, cle prens 0.5 seconde par ligne en gros ( le cut est dans une boucle) c'est absolument impossible dans mon cas.. peut etre aussi que je m'y suis mal pris avec mon script.. je sais pas..
En tout cas merci pour vos posts..
__________________
Desole pour l'orthographe, mais il n'y a pas d'accent sur les claviers anglais..sniff...
pseudobidon57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2007, 13h26   #10
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 946
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 946
Points : 1 085
Points : 1 085
Cut peut lire tout le fichier, tout seul (comme sed et perl). Donc, ne le mets pas dans une boucle... Si c'est le shell qui fait une boucle en appelant read et cut sur chaque ligne, c'est évident que ce soit très lent : à chaque ligne, il doit créer un processus (cut) !

Petit benchmark :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ wc -l in
320001 in
 
 
$ time sed -r 's/,[^,]*//;s/[^,]*,//4'
0,90s user 0,03s system 99% cpu 0,933 total
 
$ time sed -r 's/[^,]*,//2; s/[^,]*,//4' in > out
1,05s user 0,03s system 100% cpu 1,083 total
 
$ time sed -r 's/^([^,]*,)([^,]*,)([^,]*,)([^,]*,)([^,]*,)/\1\3\4/' in > out
2,88s user 0,06s system 99% cpu 2,944 total
 
$ time sed -r 's/^([^,]*,)[^,]*,([^,]*,)([^,]*,)[^,]*,/\1\2\3/' in > out
2,93s user 0,04s system 99% cpu 2,967 total
 
 
$ time cut -d',' -f1,3,4,6- in > out
0,15s user 0,02s system 98% cpu 0,170 total
 
$ time cut -d',' --complement -f2,5 in > out
0,12s user 0,05s system 97% cpu 0,176 total
Perl a une vitesse comparable à sed sur les tests (il est légèrement plus rapide). Cut va vraiment plus vite, ce qui me semble logique.
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2007, 14h07   #11
Membre du Club
 
Avatar de pseudobidon57
 
Inscription : octobre 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 133
Points : 65
Points : 65
oui, c'est ce que je viens de voir en relisant vos posts, simplement, je ne savais pas que cut -d pouvais prendre plusieur arguments pour plusieurs occurences du delimiteur et s'ecrire de cette facon . De toute maniere, j'ai mal concu mon script, car j'ai mal apprecier le probleme qui m'etait pose.

Mille fois merci. j'ai resolu mon probleme une fois de plus grace a ce merveilleux forum, et les merveilleuse personnes qui y participe
__________________
Desole pour l'orthographe, mais il n'y a pas d'accent sur les claviers anglais..sniff...
pseudobidon57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h51.


 
 
 
 
Partenaires

Hébergement Web