Découpage de texte

Résolu
romzzzz -  
 romzzzz -
Bonjour,

Je dispose d'un fichier texte contenant du texte avec plusieurs paragraphes, chaque paragraphe étant sépare d'un autre par une ligne blanche.
Je souhaiterai récupérer chaque paragraphe dans un fichier, comme cela :

Fichier1 = paragraphe 1
Fichier2 = paragraphe 2
etc etc

Je ne connais pas le nombre de paragraphes à l'avance et je travaille en shell script.

Merci !

3 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    nawk 'BEGIN{i=1}; /^$/ {i++;next} ; {print > "fichier" i} fichier
    1
    1. romzzzz
       
      Hey !

      $> cat dump_1850

      32 03 00 00 00 00 FF FF FF FF 2D 00 01 00 00 2..

      05 00 09 00 01 00 01 00 01 00 01 00 00 00 00 00
      00 00 00 00 00 00 00 00 00 00 00 00 00 FF 2D 00

      00 FF 00 FF 00 00 00 00 00 00 04 65 00 00 FF FF
      00 03 00 01 01 00 FF FF F0 01 00 FF 00 00 05 37
      00 80 00

      32 03 00 00 00 00 FF FF FF FF 2D 00 00 01 81 2..

      05 00 09 00 01 00 01 00 01 00 01 00 00 00 00 00
      00 00 00 00 00 00 00 00 00 00 00 00 00 FF 2D 00

      00 FF 00 FF 00 00 00 00 00 00 04 65 00 00 FF FF
      00 03 00 01 01 00 FF FF F0 01 00 FF 00 00 05 37
      00 80 00
      $> nawk 'BEGIN{i=1}; /^$/ {i++;next} ; {print > "fichier" i}' dump_1850
      nawk: syntax error at source line 1
      context is
      BEGIN{i=1}; /^$/ {i++;next} ; {print > "fichier" >>> i <<< }
      nawk: illegal statement at source line 1


      ?
      0
    2. romzzzz
       
      Pour être plus clair je voudrais obtenir ces fichiers :

      $> cat dump_1850_1
      32 03 00 00 00 00 FF FF FF FF 2D 00 01 00 00 2..

      $> cat dump_1850_2
      05 00 09 00 01 00 01 00 01 00 01 00 00 00 00 00
      00 00 00 00 00 00 00 00 00 00 00 00 00 FF 2D 00

      $> cat dump_1850_3
      00 FF 00 FF 00 00 00 00 00 00 04 65 00 00 FF FF
      00 03 00 01 01 00 FF FF F0 01 00 FF 00 00 05 37
      00 80 00

      $> cat dump_1850_4
      32 03 00 00 00 00 FF FF FF FF 2D 00 00 01 81 2..

      $> cat dump_1850_5
      05 00 09 00 01 00 01 00 01 00 01 00 00 00 00 00
      00 00 00 00 00 00 00 00 00 00 00 00 00 FF 2D 00

      $>cat dump_1850_6
      00 FF 00 FF 00 00 00 00 00 00 04 65 00 00 FF FF
      00 03 00 01 01 00 FF FF F0 01 00 FF 00 00 05 37
      00 80 00

      Voilà :)
      0
    3. Franzux Messages postés 9705 Statut Contributeur 1 146
       
      nawk 'BEGIN{i=1}; /^$/ {i++;next} ; {print > "dump_1850" i}' dump_1850


      Et là tu as le bon résultat !
      0
    4. romzzzz
       
      Non le problème n'est pas dans le nom des fichiers (peu m'importe le nom des fichiers, je peux le changer...), mais dans la syntaxe du awk (cf post précédent) :

      $> nawk 'BEGIN{i=1}; /^$/ {i++;next} ; {print > "fichier" i}' dump_1850
      nawk: syntax error at source line 1
      context is
      BEGIN{i=1}; /^$/ {i++;next} ; {print > "fichier" >>> i <<< }
      nawk: illegal statement at source line 1
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    essayer
    nawk 'BEGIN{i=1}; /^$/ {i++;next} ; {n=sprintf("dump_1850_%d", i);print > n }' fichier 
    1
    1. romzzzz
       
      C'est presque ca !! :

      ~/Essais>cat dump_1850
      32 03 00 00 00 00 FF FF FF FF 2D 00 01 00 00 2..


      05 00 09 00 01 00 01 00 01 00 01 00 00 00 00 00
      00 00 00 00 00 00 00 00 00 00 00 00 00 FF 2D 00
      03 03 00 00 FF 00 00 FF 00 00 FF 00 00 01 A 00
      65 00 AB 3 48 01 01 00 00 00 00 00 00 FF FF 00
      00 5A 3 FF 00 FF 00 00 00 00 00 00 FF FF 00 00
      78 39 FF 00 FF 00 00 00 00 00 00 FF FF 00 00 00
      00 FF 00 FF 00 00 00 00 00 00 04 65 00 00 FF FF
      00 03 00 01 01 00 FF FF F0 01 00 FF 00 00 05 37
      00 80 00


      32 03 00 00 00 00 FF FF FF FF 2D 00 00 01 81 2..


      05 00 09 00 01 00 01 00 01 00 01 00 00 00 00 00
      00 00 00 00 00 00 00 00 00 00 00 00 00 FF 2D 00
      03 03 00 00 FF 00 00 FF 00 00 FF 00 00 01 A 00
      65 00 AB 3 48 01 01 00 00 00 00 00 00 FF FF 00
      00 5A 3 FF 00 FF 00 00 00 00 00 00 FF FF 00 00
      78 39 FF 00 FF 00 00 00 00 00 00 FF FF 00 00 00
      00 FF 00 FF 00 00 00 00 00 00 04 65 00 00 FF FF
      00 03 00 01 01 00 FF FF F0 01 00 FF 00 00 05 37
      00 80 00

      ~/Essais>nawk 'BEGIN{i=1}; /^$/ {i++;next} ; {n=sprintf("dump_1850_%d", i);print > n }' dump_1850
      ~/Essais>cat dump_1850_1

      32 03 00 00 00 00 FF FF FF FF 2D 00 01 00 00 2..

      ~/Essais>cat dump_1850_2
      05 00 09 00 01 00 01 00 01 00 01 00 00 00 00 00
      00 00 00 00 00 00 00 00 00 00 00 00 00 FF 2D 00
      03 03 00 00 FF 00 00 FF 00 00 FF 00 00 01 A 00
      65 00 AB 3 48 01 01 00 00 00 00 00 00 FF FF 00
      00 5A 3 FF 00 FF 00 00 00 00 00 00 FF FF 00 00
      78 39 FF 00 FF 00 00 00 00 00 00 FF FF 00 00 00
      00 FF 00 FF 00 00 00 00 00 00 04 65 00 00 FF FF
      00 03 00 01 01 00 FF FF F0 01 00 FF 00 00 05 37
      00 80 00


      32 03 00 00 00 00 FF FF FF FF 2D 00 00 01 81 2..

      ~/Essais>cat dump_1850_3
      05 00 09 00 01 00 01 00 01 00 01 00 00 00 00 00
      00 00 00 00 00 00 00 00 00 00 00 00 00 FF 2D 00
      03 03 00 00 FF 00 00 FF 00 00 FF 00 00 01 A 00
      65 00 AB 3 48 01 01 00 00 00 00 00 00 FF FF 00
      00 5A 3 FF 00 FF 00 00 00 00 00 00 FF FF 00 00
      78 39 FF 00 FF 00 00 00 00 00 00 FF FF 00 00 00
      00 FF 00 FF 00 00 00 00 00 00 04 65 00 00 FF FF
      00 03 00 01 01 00 FF FF F0 01 00 FF 00 00 05 37
      00 80 00


      Comme vous le voyez il y a un problème avec le dump_1850_2 et il n'y a pas de dump_1850_4 !

      PS : le fichier de départ n'est pas exactement le même que tout à l'heure mais ca doit marcher pour celui-ci aussi et je devrais dans ce cas obtenir 4 fichiers.
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      effectivement, parce qu'il y a plusieurs lignes vides
      $ nawk 'BEGIN{x=i=1}; /^$/ {x=0;next} ; {if(!x)i++;x=1;n=sprintf("dump_1850_%d", i);print > n }' fichier
      $ ls du*
      dump_1850_1  dump_1850_2  dump_1850_3  dump_1850_4
      $
      
      0
    3. romzzzz
       
      Ok c'est parfait, merci beaucoup !
      0
  3. xiawi
     
    Fonctionne très bien avec awk sous bash en tout cas:

    [xiawi@localhost tmp]$ awk 'BEGIN{i=1}; /^$/ {i++;next} ; {print > "dump_1850" i}' dump_1850
    
    [xiawi@localhost tmp]$ cat dump_18501
    32 03 00 00 00 00 FF FF FF FF 2D 00 01 00 00 2..
    [xiawi@localhost tmp]$ cat dump_18506
    00 FF 00 FF 00 00 00 00 00 00 04 65 00 00 FF FF
    00 03 00 01 01 00 FF FF F0 01 00 FF 00 00 05 37
    00 80 00
    


    Peut-être un problème avec nawk?

    Si tu es sous sh par exemple, il est possible que cela vienne de ta double quote. Ici, la simple quote a été remplacée par \047:
    https://www.developpez.net/forums/d708669/systemes/linux/shell-commandes-gnu/awk-probleme-quote-fonction-awk/

    Je ne connais pas le code pour la double quote, mais une fois trouvé, tu peux essayer.
    0
    1. romzzzz
       
      Malgré plusieurs essais en tenant compte de tes remarques, cela ne fonctionne toujours pas...
      J'ai déjà eu des problèmes avec awk et cela venait de ma version awk Solaris et non linux.

      Merci en tout cas !
      0