Concatener chaines d'un texte

Résolu
seb75 Messages postés 20 Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour,
j'ai un souci pour concatener des chaines d'un texte.
Je m'explique, j'ai un fichier.txt de cette forme:
a bonjour
comment
a ca
a va
?

je voudrais effectuer une concatenation d'une ligne commencant par "a" avec la prochaine ligne qui ne commence par par "a", afin d'obtenir :

a bonjour comment
a ca
a va ?

J'ai pensé à :
# si le premier caractere de la ligne n est pas "a", on la concatene avec la precedente
while read ligne
do
if [ "${ligne::1}" != "a" ]
then
(cat ${ligne} ${ligne+1}) > toto.txt
fi
done < fichier.txt

Mais ca ne fonctionne pas (je suis débutant...)

Merci de votre aide.
Configuration: Mac OS X
Safari 523.10

13 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    C'est plus complexe que tu ne le crois ton affaire ;-((

    Mais il y a une solution avec "sed" (voir à ce sujet SED - The Stream EDitor - Part III - Étiquettes, boucles et mémoires tampons), et en voici une adaptation à ton cas :
    [jp@MDK-2008 trash]$ cat plop
    <bonjour
    allez
    <vous bien
    <oui
    je vais bien
    merci
    
    [jp@MDK-2008 trash]$ sed -n '
    :no
    /^</!{
    1!H
    1h
    x
    s/\n/ /g
    x
    $b der
    d
    }
    /^</{
    x
    /^$/!p
    $b der
    d
    b no
    }
    :der
    ' plop > fichier.txt
    
    [jp@MDK-2008 trash]$ cat fichier.txt
    <bonjour allez
    <vous bien
    <oui je vais bien merci
    
    [jp@MDK-2008 trash]$
    ;-))
    1
  2. piopicolo Messages postés 1422 Statut Membre 200
     
    ton problème c'est que pour avoir le résultat tu dois connaitre le résultat. çà ne peut pas marcher.
    je m'explique : tu veux écrire "comment çà va" avec des phrases déjà construite comprenant les mêmes mots donc c'est inutile car tu connais ce que tu veux écrire et si tu écris à partir de phrase au hasard tu auras n'importe quoi! Bref, expliques un peu mieux ton problème et ce que tu veux résoudre!

    A+
    0
  3. seb75
     
    Je n'ai pas trop compris ta réponse mais je vais tenter de me réexpliquer.

    J'ai le fichier SEB.TXT suivant :

    <bonjour
    allez
    <vous bien
    <oui
    je vais bien
    merci

    Je souhaite obtenir (dans un fichier TOTO.TXT)

    <bonjour allez
    <vous bien
    <oui je vais bien merci
    0
  4. piopicolo Messages postés 1422 Statut Membre 200
     
    Je ne comprends toujours pas ! tu connais ce que tu veux obtenir DONC il n'y a pas de problème !!! Si tu dois trier des phrases ou les mettre selon un ordre précis y a des tas de moyens.
    Mais là je ne saisis pas ce que tu veux faire.
    Si tu veux seulement concatener les phrases reçues sans la première lettre (a ou >) c'est pas sorcier mais si tu dois les trier avant tu dois bien connaitre ce que tu veux obtenir !

    A+
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. seb75
     
    je veux concatener une chaine n'ayant pas "a" comme premier caractere avec la chaine précédente.
    je sais que ce n'est pas sorcier mais je n'y arrive pas !
    Merci de ton aide
    0
  7. piopicolo Messages postés 1422 Statut Membre 200
     
    tu mets chaque phrase reçue dans un tableau déclaré en texte. Chaque cellule du tableau doit être dimensionnée au maximum de charactères éstimés reçus (100). tu dimensionnes le tableau pour ce que tu veux recevoir et lorsqu'il est plein tu concatenes toute les cellules du tableau (ou avant)
    Après tu le réinitialises à 0.
    A+
    0
  8. piopicolo Messages postés 1422 Statut Membre 200
     
    comme tu va concatener les lignes de caractères (100) ayant plein de blanc ou de 0.
    Avant écriture du texte final, tu fais une boucle pour enlever tous les blancs ou zéros superflus (blanc >1)

    A+
    0
  9. seb75
     
    Merci, mais je voyais plus quelque chose comme ça:

    ${ligne1}=" "
    while read ligne
    do
    if [ "${ligne::1}" != "a" ]
    then
    (${ligne}${ligne1}) >> TOTO.TXT
    ${ligne1}=${ligne}
    else
    ${ligne}>>TOTO.TXT
    fi
    done < SEB.TXT

    Parce que comme je l'ai dit, je suis débutant et je ne réussirai pas à faire ce que tu m'as dis (je ne sais meme pas faire un tableau...)

    Merci beaucoup pour ton idée en tout cas.
    0
  10. seb75 Messages postés 20 Statut Membre
     
    Merci Jipicy !!
    ca marche très bien, à l'exception que ca ne m'affiche pas la dernière chaine (<merci) lorsque j'ai :
    <bonjour
    allez
    <vous bien
    <oui
    je vais bien
    <merci

    au lieu de :
    <bonjour
    allez
    <vous bien
    <oui
    je vais bien
    merci
    0
  11. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    [jp@MDK-2008 trash]$ cat plop
    <bonjour
    allez
    <vous bien
    <oui
    je vais bien
    <merci
    
    [jp@MDK-2008 trash]$ sed -n '
    :no
    /^</!{
    1!H
    1h
    x
    s/\n/ /g
    x
    $b der
    d
    }
    /^</{
    x
    /^$/!p
    $b der
    d
    b no
    }
    :der
    ' plop > fichier.txt
    
    [jp@MDK-2008 trash]$ cat fichier.txt
    <bonjour allez
    <vous bien
    <oui je vais bien
    <merci
    
    [jp@MDK-2008 trash]$
    Ben ça marche aussi, non ?
    0
  12. seb75 Messages postés 20 Statut Membre
     
    autant pour moi,
    ca marche à merveille !
    Merci Jipicy
    0
  13. seb75 Messages postés 20 Statut Membre
     
    autant pour moi,
    ca marche à merveille !
    Merci Jipicy
    0
  14. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    C'est plus complexe que tu ne le crois ton affaire ;-((
    En effet ;-)

    Voici une solution Perl avec un test avant positif ;-)
    lami20j@debian:~/trash$ cat seb75
    <bonjour
    allez
    <vous bien
    <oui
    je vais bien
    merci
    lami20j@debian:~/trash$ perl -e '$l=`cat seb75`;$l=~s/\n(?=^\w)/ /mg;print $l'
    <bonjour allez
    <vous bien
    <oui je vais bien merci
    

    0