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 :

Joindre des lignes avec des commandes shell


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 Joindre des lignes avec des commandes shell
    Bonsoir à tous,

    En fait, j'ai un fichier comportant plusieurs lignes, dont des lignes qui commencent avec le séparateur "|".
    Exemple:

    ligne1
    ligne2
    ligne3
    |ligne4
    ligne5
    |ligne6
    ......

    J'aimerais joindre chaque ligne commençant par "|" avec sa ligne précédente tout en gardant le "|" comme séparateur des deux lignes.

    Exemple
    ligne1
    ligne2
    ligne3|ligne4

    ligne5|ligne6
    ......
    J'ai essayé sous sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sed -e :a -e '$!N;s/^|/|/;ta' -e 'P;D'
    malheureusement sa ne marche pas lol.
    Pourriez vous m'éclairez svp

  2. #2
    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
    $ cat plop 
    ligne1
    ligne2
    ligne3
    |ligne4
    ligne5
    |ligne6
    ligne7
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ sed -n '$!N;/\n|/{s/\n//;P;D};p' plop 
    ligne1
    ligne2
    ligne3|ligne4
    ligne5|ligne6
    ligne7

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 585
    Points : 19 462
    Points
    19 462
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ echo "ligne1
    ligne2
    |ligne3
    ligne4
    ligne5
    |ligne6" | sed -n '$!N;/\n|/{s/\n//;P;D};p'
    ligne1
    ligne2
    |ligne3
    ligne4
    ligne5|ligne6
    ça ne fonctionne qu'avec le séparateur sur les lignes paires.
    EDIT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed  ':z;N;$!bz;s/\n|/|/g'
    tout simplement ?


    sab113: que se passe-t-il en amont pour que le fichier ait ce format ?

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 263
    Points : 13 520
    Points
    13 520
    Par défaut
    Si tu es allergique aux boucles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ sed 'H;/|/{g;s/\n|/|/;h};$!d;g;s/^\n//' plop
    ligne 1
    ligne 2|ligne 3
    ligne 4
    ligne 5|ligne 6

  5. #5
    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 N_BaH Voir le message
    ça ne fonctionne qu'avec le séparateur sur les lignes paires.
    Effectivement, je n'avais pas cherché plus loin que l'exemple
    Merci

    Sinon : sed -n '$!N;/\n|/{s/\n//;P;D};P;D' devrait rattraper ma faute

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 263
    Points : 13 520
    Points
    13 520
    Par défaut
    Non Zipe31. Ce que tu n'as pas compris, c'est que le N est executé une seule fois par ligne.
    Donc sans boucle ou buffer, tu auras toujours un problème.

    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
    20
    21
    22
    23
    $ cat initial.txt 
    ligne 1
    ligne 2
    |ligne 3
    ligne 4
    ligne 5
    |ligne 6
    ligne7
    |ligne8
    |ligne9
    |ligne10
    |ligne11
    |ligne12
    |ligne13
    $ sed -n '$!N;/\n|/{s/\n//;P;D};P;D' initial.txt 
    ligne 1
    ligne 2|ligne 3
    ligne 4
    ligne 5|ligne 6
    ligne7|ligne8
    |ligne9|ligne10
    |ligne11|ligne12
    |ligne13

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 302
    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 302
    Points : 12 798
    Points
    12 798
    Par défaut
    Ma petite contribution (sans boucle)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '1h;2,$H;${x;s/\n|/|/g;p}' plop

  8. #8
    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 Flodelarab Voir le message
    Non Zipe31. Ce que tu n'as pas compris, c'est que le N est executé une seule fois par ligne.
    Donc sans boucle ou buffer, tu auras toujours un problème.
    Ce n'est pas que je n'ai pas compris le fonctionnement de "N", mais disons que l'heure et l'âge avancés ne m'ont pas trop aidé sur ce coup

    Merci pour la correction

  9. #9
    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, N_BaH , Flodelarab et disedorgue pour toutes vos réponses

  10. #10
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonsoir.

    Petite question ? Si plusieurs lignes d'affilés sont commencent par '|', elles sont du coup toutes jointes entre elles ?

    Si oui, solution un peu barbare en awk (qui peut sans doute se simplifier), juste pour le plaisir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{i++; if ($0 ~ /^\|/){t[i]=prec""$0; delete t[i-1];}else{t[i]=$0}; prec=t[i];} END {n=asorti(t, tkey); for (i=1;i<=n;i++){print t[tkey[i]];}}' fichier.txt
    Tests effectués :

    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
    20
    21
    22
    23
    ThinkPad-T420 ~ $ cat test.txt 
    ligne1
    ligne2
    ligne3
    |ligne4
    ligne5
    |ligne6
    ThinkPad-T420 ~ $ awk '{i++; if ($0 ~ /^\|/){t[i]=prec""$0; delete t[i-1];}else{t[i]=$0}; prec=t[i];} END {n=asorti(t, tkey); for (i=1;i<=n;i++){print t[tkey[i]];}}' test.txt 
    ligne1
    ligne2
    ligne3|ligne4
    ligne5|ligne6
    ThinkPad-T420 ~ $ cat test2.txt 
    ligne1
    ligne2
    |ligne3
    |ligne4
    ligne5
    |ligne6
    ThinkPad-T420 ~ $ awk '{i++; if ($0 ~ /^\|/){t[i]=prec""$0; delete t[i-1];}else{t[i]=$0}; prec=t[i];} END {n=asorti(t, tkey); for (i=1;i<=n;i++){print t[tkey[i]];}}' test2.txt 
    ligne1
    ligne2|ligne3|ligne4
    ligne5|ligne6
    Cordialement,
    Idriss

  11. #11
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 302
    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 302
    Points : 12 798
    Points
    12 798
    Par défaut
    Aller, une autre version pour la route (pour le fun):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while read I; do echo -n \"${I}\" ; done <fichier.txt | grep -o '\("[^"]*"\("|[^"]*"\)*\)\|\("[^"]*"\)' | tr -d '"'
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    $ cat titi
    ligne1
    ligne2
    |ligne3
    ligne4
    ligne5
    |ligne6
    $ while read I; do echo -n \"${I}\" ; done <titi | grep -o '\("[^"]*"\("|[^"]*"\)*\)\|\("[^"]*"\)' | tr -d '"'
    ligne1
    ligne2|ligne3
    ligne4
    ligne5|ligne6
    $ cat titu
    ligne 1
    ligne 2
    |ligne 3
    ligne 4
    ligne 5
    |ligne 6
    ligne7
    |ligne8
    |ligne9
    |ligne10
    |ligne11
    |ligne12
    |ligne13
    $ while read I; do echo -n \"${I}\" ; done <titu | grep -o '\("[^"]*"\("|[^"]*"\)*\)\|\("[^"]*"\)' | tr -d '"'
    ligne 1
    ligne 2|ligne 3
    ligne 4
    ligne 5|ligne 6
    ligne7|ligne8|ligne9|ligne10|ligne11|ligne12|ligne13

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 24/02/2014, 15h22
  2. Réponses: 6
    Dernier message: 14/08/2013, 12h21
  3. [XL-2007] Copier/coller des lignes avec des cellules verrouillées
    Par Adri687 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 10/01/2013, 11h25
  4. Passer des arguments avec la commande "Shell"
    Par bbor99 dans le forum VB.NET
    Réponses: 1
    Dernier message: 25/11/2011, 23h18
  5. Est-il possible de créer des tables avec des lignes identiques ?
    Par raton_laveur dans le forum Développement
    Réponses: 2
    Dernier message: 25/05/2009, 09h10

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