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 :

Concaténer plusieurs lignes selon une condition


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut Concaténer plusieurs lignes selon une condition
    Bonjour,

    je veux concaténer des lignes d'un fichier texte, j'ai un fichier sous ce format :
    numero:1 aa: xxx bbb:yyy taille: 8.0 texte: Derrière elle marchait une longue file de Maures,
    numero:2 aa: xxx bbb:yyy taille:12.0 texte:combat même, il avait cru souvent entendre sa
    numero:3 aa: xxx bbb:yyy taille:8.0 texte:retentirent dans tout le camp et tirèrent les soldats
    numero:4 aa: xxx bbb:yyy taille:8.0 texte:Emmanuela, l'arrêtant par le bras, lui dit d'un ton
    je veux récupérer ce qui est écrit à partir "texte:" pour chaque taille à part, par exemple : taille 12 , j'aurais qu'une seule ligne de texte

    Merci d'avance pour toute idée

  2. #2
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    ici ton fichier s'appelle t

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep ":12.0" t | sed "s/.*tail/tail/"
    ou en une seule passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/:12.0/ !d ; s/.*tail/tail/' t
    c'est juste du découpage :
    selectionner les lignes contenant ":12.0"
    ne pas l'effacer (donc tout le reste est effacé)
    substituer tout jusqu'à "tail" par "tail"

    ici ça modifie pas le fichier source

    tu peux obtenir un fichier de resultat comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/:12.0/ !d ; s/.*tail/tail/' t > z
    z sera le resultat et t reste inchangé.

    ou tu peux effacer apres les lignes non intéressantes bien sur ça change rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fpssl@fr:$ sed '/:12.0/ s/.*tail/tail/; /^taille/ !d' t
    taille:12.0 texte:combat même, il avait cru souvent entendre sa
    fpssl@fr:$ rm t
    fpssl@fr:$

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Afin que nous puissions bien comprendre ce que tu veux, pourrais-tu, pour le fichier que tu nous as donné et que j'imagine être un exemple, nous donner précisément la sortie que tu attends? (j'ai bien dit "donner" et non "décrire")

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut
    merci pour la rapidité ,
    oui je veux avoir un fichier texte taille_12 contenant :

    combat même, il avait cru souvent entendre sa
    Un autre taille_8 contenant :

    Derrière elle marchait une longue file de Maures,
    retentirent dans tout le camp et tirèrent les soldats
    l'arrêtant par le bras, lui dit d'un ton
    etc selon ma liste de choix, donc je veux juste récupérer le texte écrit après le mots "texte:" et non pas toute la ligne

  5. #5
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in 12 8 ; do sed '/'${i}'/ !d ;  s/.*texte://' fichieroriginal > taille_${i} ; done
    pour automatiser les deux extractions si tu en avais d'autres à faire
    suffira de les ajouter au niveau de la boucle for

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in 6 8 10 12 14 ; do ............


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ cat > t
    numero:1 aa: xxx bbb:yyy taille: 8.0 texte: Derrière elle marchait une longue file de Maures,
    numero:2 aa: xxx bbb:yyy taille:12.0 texte:combat même, il avait cru souvent entendre sa
    numero:3 aa: xxx bbb:yyy taille:8.0 texte:retentirent dans tout le camp et tirèrent les soldats
    numero:4 aa: xxx bbb:yyy taille:8.0 texte:Emmanuela, l'arrêtant par le bras, lui dit d'un ton 
    $ for i in 12 8 ; do sed '/'${i}'/ !d ;  s/.*texte://' t > taille_${i} ; done
    $ cat taille_8
     Derrière elle marchait une longue file de Maures,
    retentirent dans tout le camp et tirèrent les soldats
    Emmanuela, l'arrêtant par le bras, lui dit d'un ton 
    $ cat taille_12
    combat même, il avait cru souvent entendre sa
    $ rm taille_* t                                         
    $

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par frp31 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in 12 8 ; do sed '/'${i}'/ !d ;  s/.*texte://' fichieroriginal > taille_${i} ; done
    [Chipotage]Si le texte lui-même contient des nombres (genre 8 ou 12), tu vas sortir des lignes en trop.
    Si les tailles vont de 6 à 16 par exemple, même problème...
    [/Chipotage]

  7. #7
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,
    Citation Envoyé par jack-ft Voir le message
    [Chipotage]Si le texte lui-même contient des nombres (genre 8 ou 12), tu vas sortir des lignes en trop.
    Si les tailles vont de 6 à 16 par exemple, même problème...
    [/Chipotage]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in 12 8 ; do sed -n '/taille: *'"${i}"'.0/{ s/.*texte: *//p}' fichieroriginal > taille_${i} ; done
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  8. #8
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    Sinon, on peut faire avec awk :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk -F: '{ var=gensub("[^0-9]*([0-9]*).*","\\1",1,$5); printf $6"\n"   >> "taille_"var".txt" }' texte.txt

  9. #9
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in 12 8 ; do sed -n '/taille: *'"${i}"'.0/{ s/.*texte: *//p}' fichieroriginal > taille_${i} ; done
    c'est pourquoi j'ai bien pris la précaution de dire

    pour avoir d'autres tailles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in  6 8 10 12 14 ............
    un peu plus haut

  10. #10
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Citation Envoyé par frp31 Voir le message
    c'est pourquoi j'ai bien pris la précaution de dire

    pour avoir d'autres tailles

    ... un peu plus haut
    Je réagissait surtout par rapport au :
    Citation Envoyé par jack-ft Voir le message
    [Chipotage]Si le texte lui-même contient des nombres (genre 8 ou 12), tu vas sortir des lignes en trop.
    [/Chipotage]
    D'où ma syntaxe qui cible le numéro plus le texte qui le précède sans oublier les deux points et un éventuel espace... '/taille: *'"${i}"'.0/
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut
    merci bien pour la remarque, oui effectivement mon texte peut contenir des chiffres

    Est ce que c'est possible de mettre deux critères de selection à l'intérieur de sed ? Rajouter par exemple "numero:1" avec le critère taille

  12. #12
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par AJ_ing Voir le message
    Est ce que c'est possible de mettre deux critères de selection à l'intérieur de sed ? Rajouter par exemple "numero:1" avec le critère taille
    Oui.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /numero:1.*taille: *'"${i}"'.0/
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut
    salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /numero:1.*taille: *'"${i}"'.0/
    avec un seul critère "la taille" ça tourne bien mais , en ajoutant un autre j'ai rien en sortie,
    comment dire à sed tiens compte des deux conditions
    le point après 1 c'est quoi l'utilité, j'ai pas de 1 dans mon fichier d'origine

    Merci

  14. #14
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    avec un seul critère "la taille" ça tourne bien mais , en ajoutant un autre j'ai rien en sortie,
    comment dire à sed tiens compte des deux conditions
    Ben comme dans mon dernier exemple

    le point après 1 c'est quoi l'utilité
    Le point et l'astérisque qui le suit sont là pour signifier n'importe quel caractère y compris plusieurs voire même aucun. Donc zéro, un ou plusieurs.

    j'ai pas de 1 dans mon fichier d'origine
    Ben je me suis fié à ton 1er exemple où il y avait :
    numero:1 aa: xxx bbb:yyy taille: 8.0 texte: Derrière elle marchait une longue file de Maures,
    numero:2 aa: xxx bbb:yyy taille:12.0 texte:combat même, il avait cru souvent entendre sa
    numero:3 aa: xxx bbb:yyy taille:8.0 texte:retentirent dans tout le camp et tirèrent les soldats
    numero:4 aa: xxx bbb:yyy taille:8.0 texte:Emmanuela, l'arrêtant par le bras, lui dit d'un ton
    Merci de donner un exemple CONCRET de ce que tu veux alors
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut
    Le point et l'astérisque qui le suit sont là pour signifier n'importe quel caractère y compris plusieurs voire même aucun. Donc zéro, un ou plusieurs.
    Merci pour l'explication, oui c'est le même fichier , j'ai voulu rajouter le numéro avec la taille
    par exemple je veux avoir le texte de taille 8 et numéro 1 ,j'ai mis ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/numero:1. *taille: *8.0 / { s/.*texte: *//p}' images_francais.txt > resultat
    Ma faute est que j'ai mis un espace entre . et * de taille,votre code est bien

    Ben , un autre souci est que si j'indique numéro 1, j'aurai des textes en plus de tous les chiffres contenant 1 du champ numero qui peut contenir (11, 110,21, ...)

    Merci encore

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut
    il suffit de rajouter espace après le numéro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/numero:1 .*taille: *8.0 / { s/.*texte: *//p}' images_francais.txt > resultat
    Merci

  17. #17
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par AJ_ing Voir le message
    il suffit de rajouter espace après le numéro
    Euh... normalement non, ça doit/devrait marcher même sans espace, le "." représentant un caractère quelconque y compris un espace
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Points : 133
    Points
    133
    Par défaut
    Bonjour,

    je comprends pas d'oû vient l'erreur ,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/numero:'"${numero}"' .*degradation: *deg'"${j}"'/ { s/.*texte: *//p}' fichier
    sed: -e expression #1, char 53: extra characters after command
    Merci d'avance

  19. #19
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,
    Citation Envoyé par AJ_ing Voir le message
    je comptrends pas d'oû vient l'erreur ,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: -e expression #1, char 53: extra characters after command
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/numero:'"${numero}"' .*degradation: *deg'"${j}"'/ { s/.*texte: *//p}' fichier
    Euh... sans une idée du contenu du fichier et des variables "${numero}" et "${j}", difficile de se faire une idée

    Mais à vue de nez (sed: -e expression #1, char 53: extra characters after command), il semblerait qu'un caractère proche de celui des motifs (/) pourrait poser problème
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  20. #20
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Et la variable "${liste}" elle ressemble à quoi ?
    $ man woman
    Il n'y a pas de page de manuel pour woman.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 8
    Dernier message: 04/02/2015, 04h25
  2. Supprimer des lignes selon une condition
    Par j0joo dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 27/03/2014, 14h40
  3. Concatener plusieurs lignes en une selon condition
    Par budfox777 dans le forum Excel
    Réponses: 3
    Dernier message: 27/03/2012, 18h40
  4. [XL-2003] Insérer une ligne selon une condition
    Par MiXinG dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 02/07/2009, 17h20
  5. Concaténer plusieurs ligne d'une m^me table
    Par bobosh dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 11/08/2008, 16h13

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