IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

sed et expression reguliere


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de pseudobidon57
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    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

  2. #2
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Cut est plus adapté pour ce genre de travail.

    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre confirmé Avatar de pseudobidon57
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut
    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+

  4. #4
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Par défaut
    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.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  5. #5
    Membre confirmé Avatar de pseudobidon57
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut
    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..

  6. #6
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    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.

    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...

  7. #7
    Membre confirmé Avatar de pseudobidon57
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut
    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

  8. #8
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sed et expressions regulieres
    Par muse19 dans le forum Linux
    Réponses: 4
    Dernier message: 26/11/2010, 14h19
  2. Sed et expressions regulieres
    Par Tronche dans le forum Linux
    Réponses: 1
    Dernier message: 16/03/2007, 14h52
  3. Réponses: 2
    Dernier message: 16/06/2003, 15h15
  4. [langage] surement une expression régulière...
    Par armada dans le forum Langage
    Réponses: 5
    Dernier message: 30/05/2003, 17h06
  5. [langage] expression reguliere motif répétitif dans 1 pattern
    Par comme de bien entendu dans le forum Langage
    Réponses: 11
    Dernier message: 09/04/2003, 16h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo