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 :

fusionner plusieurs lignes en une seule (sed, awk..)


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 63
    Points : 86
    Points
    86
    Par défaut fusionner plusieurs lignes en une seule (sed, awk..)
    Bonjour à tous,

    J'essaye de fusionner plusieurs lignes d'un fichier dans plusieurs
    par exemple j'ai un fichier "fich1" contenant des groupes de mots différents séparé par une ligne vide.Chaque mot est sur une ligne.
    terme1
    terme2
    terme3
    terme4

    terme5
    terme6
    terme7
    terme8

    terme9
    terme10

    terme 11
    et je voudrais fusionner chaque groupe de mots en une seule ligne :
    terme1 terme2 terme3 terme4

    terme 5 terme6 terme7 terme 8

    terme9 terme10

    terme11

    J'avais essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk{ if (NF != 0) printf(« %s », $0)}’ fich1
    mais ça ne marche pas.

    Merci à l'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ cat fichier | tr "\n" "\ " | sed 's/  /\n\n/g'
    terme1 terme2 terme3 terme4
     
    terme5 terme6 terme7 terme8
     
    terme9 terme10
     
    terme 11
    Le tr remplace les saut de ligne de ton fichier par un espace.
    Le sed remplace un double espace par 2 saut de ligne.

    Par contre ça ne marchera pas bien dans le cas d'un espace en fin ou en début de ligne. Ou s'il y a 2 espaces sur une de tes lignes >_<

    Il doit y avoir mieux
    Dernière modification par Invité ; 09/12/2012 à 17h00.

  3. #3
    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,

    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
    $ cat plop 
    terme1
    terme2
    terme3
    terme4
     
    terme5
    terme6
    terme7
    terme8
     
    terme9
    terme10
     
    terme 11
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ sed ':z;N;/\n$/!bz;s/\n\b/ /g' plop 
    terme1 terme2 terme3 terme4
     
    terme5 terme6 terme7 terme8
     
    terme9 terme10
     
    terme 11
     
    $

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Variante awk:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{OFS=" ";RS=ORS="\n\n"}{$1=$1}1' fichier

  5. #5
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bonsoir Ripat,

    Je n'ai pas tout compris dans ta manière d'utiliser awk (faut que je bosse ça un peu), mais je suis surpris de voir OFS=" " puisque c'est sa valeur par défaut. ça fonctionne sans chez moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{RS=ORS="\n\n"}{$1=$1}1' fichier

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 63
    Points : 86
    Points
    86
    Par défaut
    MERCI zipe31, ripat et jmelyn pour toutes vos suggestions.
    Très bonne soirée à tous.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Citation Envoyé par jmelyn Voir le message
    ... mais je suis surpris de voir OFS=" " puisque c'est sa valeur par défaut. ça fonctionne sans chez moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{RS=ORS="\n\n"}{$1=$1}1' fichier
    Très juste. Il n'était pas nécessaire d'assigner la valeur par défaut à OFS. Bien vu.

    Quant à la construction un peu ésotérique, et awk n'en est pas dépourvue, le $1=$1 force awk à reconstruire le "record" courant avec de nouvelles valeurs de RS, ORS FS ou OFS. Le 1 après le deuxième bloc d'instructions est évalué à TRUE forcant ainsi un print implicite. Dans awk, si l'ensemble des instructions s'évalue à TRUE, un print est toujours forcé.

    On aurait ainsi également pu écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '$1=$1' ORS="\n\n" RS="\n\n"  file
    $1=$1 reconstruit le record et retourne un TRUE, donc print. Le reste est une assignation de variables alternative à ce qu'on aurait pu faire dans le bloc BEGIN. Awk excelle dans l'exercice du "obfuscated code"!

    Lien sur la reconstruction du record (bas de page)
    http://www.gnu.org/software/gawk/man...ng-Fields.html

    Lien sur une écriture idiomatique de awk
    http://backreference.org/2010/02/10/idiomatic-awk/

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ca va bien me servir ces posts.
    Dans les cours unix ils présente toujours brièvement awk, à part si c'est un cours spécifique awk. La raison est pourtant évidente, on peux faire énormément de chose avec, donc ce serait trop long à expliquer dans un "petit" cours.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    C'est une erreur de ne consacrer qu'aussi peu de temps sur awk. C'est un langage concis et rapide. Le précurseur de Perl. On peut même faire un serveur web avec awk même s'il est vrai que dans ce cas un langage plus moderne est évidemment plus approprié.


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

Discussions similaires

  1. fusionner plusieurs lignes en une seule
    Par assiya dans le forum Langage SQL
    Réponses: 7
    Dernier message: 22/02/2011, 13h36
  2. Plusieurs lignes dans une seule
    Par rlnd23 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/02/2007, 16h35
  3. [MySQL] Remplir plusieurs lignes d'une seule table avec le même formulaire
    Par zehni dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/09/2006, 12h12
  4. [VBA] Fusionner plusieurs colonnes en une seule
    Par brutos2 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 18/01/2006, 14h25
  5. Concatenation de plusieurs lignes en une seule
    Par stawen dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2005, 13h55

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