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 :

Transformer un fichier .txt


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut Transformer un fichier .txt
    Bonjour,

    je suis novice en Shell, et après avoir fait un extraction j'ai obtenu un fichier de la forme suivante

    groupe1
    aaaa
    cccc
    dddd
    --
    groupe2
    rrrrrr
    gggg
    bbbb
    --
    j'aimerai bien extraire les groupes et les mettre à coté des membre
    un peu comme ça

    groupe1;aaaa
    groupe1;cccc
    groupe1;dddd
    --
    
    groupe2;rrrrrr
    groupe2;gggg
    groupe2;bbbb
    --
    j'arrive à coller qu'un groupe en combinant une variable et un sed, soit dit en passant le groupe se colle partout, je n'ai pas mis de condition me permettant de passer au groupe suivant et je ne vois pas comment faire d'ailleurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for s in `egrep -v 'uid|cn|--' xxxx.csv` ;do 
    sed -e 's/\(uid=.*\)/\1\;'"$s"'/' xxxxx.csv >resultat.txt
    done;
    pouvez vous m'aider ?
    merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    As-tu à chaque fois 3 membres comme dans ton exemple (ça m'étonnerais)?
    Les groupes sont-ils bien séparé par un "--" à chaque fois ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    salut

    en effet, suivant le groupe, le nombre de membres est différents

    pour la deuxième question, oui le fichier se termine bien par --, j'ai fait l'extraction de manière a bien dissocier les groupes

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par huître Voir le message
    pour la deuxième question, oui le fichier se termine bien par --, j'ai fait l'extraction de manière a bien dissocier les groupes
    Salut
    Dans ce cas, pas de souci. te suffit de lire le fichier ligne par ligne et si tu es sur "--" tu supprimes un flag que tu remplis à la ligne suivante et que tu utilises pour les autres lignes...

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #!/bin/sh
    cat fichier | while read ligne
    do
        # Si on est  sur la ligne repère
        if test "$ligne" = "--"
        then
            # On écrit la ligne et une ligne vide (comme dans l'exemple)
            echo "$ligne"
            echo
     
            # On supprime le flag et on passe à la ligne suivante
            unset groupe
            continue
        fi
     
        # Si on est sur une ligne et que le flag n'existe pas
        if test -z "$groupe"
        then
            # On se trouve fatalement sur une ligne "groupe"
            groupe="$ligne"
            continue
        fi
     
        # On est sur une ligne standard - On la réécrit en rajoutant le groupe
        echo "$groupe:$ligne"
    done

    Citation Envoyé par huître Voir le message
    et je ne vois pas comment faire d'ailleurs
    Arrivé à un certain niveau de difficulté, faut arrêter de croire que les outils de base sont assez "magiques" pour tout faire et faut plonger un peu les mains dans la prog (quoique j'ai vu parfois des trucs extraordinaires faits avec une simple regex...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Ma solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '/--/ {print ""} $1 != "--" {printf("%s ",  $1)}' fichier3.txt  | awk '{for (i = 2; i <= NF; i++) { print $1 ";" $i}; print "--"}'
    Edit: j'avais pas vu. S'il y a des espaces, utiliser un caractère | ou # comme séparateur de champs

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    merci les deux solutions marche à merveille vous êtes des genies

  7. #7
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    Pour info, 2 solutions sed:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $ cat test.txt 
    groupe1
    aaaa
    cccc
    dddd
    --
    groupe2
    rrrrrr
    gggg
    bbbb
    --
    $ sed -n '/--/{s/.*//;x;s/;//;s/\n//g;p;d};s/^/;/;H' test.txt 
    groupe1;aaaa;cccc;dddd
    groupe2;rrrrrr;gggg;bbbb
    $ sed ':z;N;/--/!b z;s/\n/;/g;s/;--//' test.txt 
    groupe1;aaaa;cccc;dddd
    groupe2;rrrrrr;gggg;bbbb

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par noooop Voir le message
    Ma solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '/--/ {print ""} $1 != "--" {printf("%s ",  $1)}' fichier3.txt  | awk '{for (i = 2; i <= NF; i++) { print $1 ";" $i}; print "--"}'
    Pas mal. J'ai dû la tester pour la comprendre.

    Mais le second awk peut avantageusement être remplacé par un sed moins gourmand.

    Citation Envoyé par Flodelarab Voir le message
    Bonjour

    Pour info, 2 solutions sed:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $ cat test.txt 
    groupe1
    aaaa
    cccc
    dddd
    --
    groupe2
    rrrrrr
    gggg
    bbbb
    --
    $ sed -n '/--/{s/.*//;x;s/;//;s/\n//g;p;d};s/^/;/;H' test.txt 
    groupe1;aaaa;cccc;dddd
    groupe2;rrrrrr;gggg;bbbb
    $ sed ':z;N;/--/!b z;s/\n/;/g;s/;--//' test.txt 
    groupe1;aaaa;cccc;dddd
    groupe2;rrrrrr;gggg;bbbb
    Très élégant aussi (surtout que j'y pige que dalle)
    Mais (hélas) il manque les lignes "--" de séparation


    Citation Envoyé par huître Voir le message
    merci les deux solutions marche à merveille vous êtes des genies
    Essaye plutôt de les étudier pour pouvoir, plus tard, les trouver toi-même et toi aussi tu seras un génie
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    en général, awk | awk peut être remplacé par un seul awk qui utilise un tableau.

    Citation Envoyé par huître
    j'ai fait l'extraction de manière a bien dissocier les groupes
    "l'extraction" elle-même pourrait être réalisée dans ce même awk.
    en attendant de voir le fichier CSV original :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    $ cat fichier
    groupe1
    aaaa
    cccc
    dddd
    --
    groupe2
    rrrrrr
    gggg
    bbbb
    --
     
    $ awk 'NR==1{g=$1}NR!=1&&!/^--$/{a[++n]=$1}/^--$/{for(i in a)printf("%s;%s\n",g,a[i]);delete a ; NR="1"}' fichier.txt
    groupe1;aaaa
    groupe1;cccc
    groupe1;dddd
    groupe2;rrrrrr
    groupe2;gggg
    groupe2;bbbb
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Ça aurait été mieux si j'avais lu la question.

    Deuxième essai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ sed -n '1{h;d};/--/{N;s/--\n//;h;d};G;s/\(.*\)\n\(.*\)/\2;\1/p' test.txt 
    groupe1;aaaa
    groupe1;cccc
    groupe1;dddd
    groupe2;rrrrrr
    groupe2;gggg
    groupe2;bbbb

  11. #11
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    en général, awk | awk peut être remplacé par un seul awk qui utilise un tableau.
    Je sais, mais j'applique l'adage: "small is beautiful". Deux procs awk simples sont plus lisibles que 1 seule complexe. Du moins pour moi. C'est plus facile quand je me relis des mois après. Et quelque fois c'est réutilisable....

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par noooop Voir le message
    Je sais, mais j'applique l'adage: "small is beautiful".
    Alors tu ne seras pas contre une solution "plus small" et donc "plus beautiful"...
    awk '/--/ {print ""} $1 != "--" {printf("%s ", $1)}' fichier3.txt | sed -e "s/ /;/"
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Alors tu ne seras pas contre une solution "plus small" et donc "plus beautiful"...
    awk '/--/ {print ""} $1 != "--" {printf("%s ", $1)}' fichier3.txt | sed -e "s/ /;/"
    Marche pas ????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    xxx@xxx:~/test1$ awk '/--/ {print ""} $1 != "--" {printf("%s ", $1)}' fichier3.txt | sed -e "s/ /;/"
    groupe1;aaaa cccc dddd 
    groupe2;rrrrrr gggg bbbb kkk

  14. #14
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    ah, oui, c'est mieux, Sve@r; mais le sed ne fait pas ce qu'il devrait, et ne sert à rien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{if($1~"--"){print v; v=""} else v=v?v";"$1:$1}' fichier
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Bonjour,

    Ma petite contribution pour le fun:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $ cat tt.vv
    groupe1
    aaaa
    cccc
    dddd
    --
    groupe2
    rrrrrr
    gggg
    bbbb
    --
    $ x=$(<tt.vv);echo ${x//--/\\n} | while read x; do set -- $x; y=$1; shift; for z in $*; do echo "$y;$z"; done; done
    groupe1;aaaa
    groupe1;cccc
    groupe1;dddd
    groupe2;rrrrrr
    groupe2;gggg
    groupe2;bbbb

  16. #16
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    alors en 100% bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read -d'--' -a ar; do for i in "${ar[@]:1}"; do echo "${ar[0]};$i"; done; done <fichier

    EDIT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read -d'--' -a ar; do ((${#ar[@]})) && printf "${ar[0]};%s\n" "${ar[@]:1}"; done <fichier
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  17. #17
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    alors en 100% bash
    Ma première aussi était 100% bash
    Moi, ce qui m'éclaterait, c'est de voir la tête de huître devant la façon dont on s'"amuse" avec son pb
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  18. #18
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut@tous,

    Et une moulinette sédesque de plus, une

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ sed -n 'h;:z;N;/--$/!{s/\n/;/p;g;bz};s/.*/--\n/p' plop 
    groupe1;aaaa
    groupe1;cccc
    groupe1;dddd
    --
     
    groupe2;rrrrrr
    groupe2;gggg
    groupe2;bbbb
    --

  19. #19
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    finalement je n'ai plus -- ce qui est devenu embarrassant
    mon grep ne renvoie plus les --

    ducoup j'ai

    groupe1
    ID=aaaaa
    ID=bbbbbb
    groupe2
    ID=aaaaa
    ID=bbbbbb
    groupe3
    ID=aaaaa
    ID=bbbbbb

    donc je ne vois pas comment faire maintenant

  20. #20
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Peux tu nous fournir un exemple concret de ce que tu veux (input-ouput) car à priori, les specs ont changés...
    Et si tu nous disais ce que tu as comme input au départ avant un filtre quelconque, peut-être que l'on pourra te donner une solution plus simple...

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/11/2012, 11h39
  2. Transformer un fichier txt en xml
    Par hitchie dans le forum Général Python
    Réponses: 4
    Dernier message: 06/05/2009, 11h05
  3. Transformer un fichier .txt en .wav
    Par stage84 dans le forum LabVIEW
    Réponses: 1
    Dernier message: 16/07/2008, 12h23
  4. Réponses: 5
    Dernier message: 19/06/2008, 23h03
  5. [Tableaux] transformation d'un fichier txt en xml
    Par edophie dans le forum Langage
    Réponses: 1
    Dernier message: 26/09/2006, 12h55

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