[SH] Récupérer lignes fichiers texte

Résolu
ZZ2F3 Messages postés 40 Date d'inscription   Statut Membre -  
ZZ2F3 Messages postés 40 Date d'inscription   Statut Membre -
Bonjour,

J'ai un fichier texte de la forme
ligne1
ligne2
ligne3
ligne4

test1
Queue
test2
Queue
test3
Queue
test4
Queue
test5
Queue
test6
Queue
test7
Queue
test8
Queue
test9
Queue
test10


Je travaille en Bash et je voudrais par exemple à partir de ce fichier créer 3 fichiers de la forme :

ligne1
ligne2
ligne3
ligne4

test1
Queue
test2
Queue
test3
Queue
test4
Queue

****

ligne1
ligne2
ligne3
ligne4

test5
Queue
test6
Queue
test7
Queue
test8
Queue

****

ligne1
ligne2
ligne3
ligne4

test9
Queue
test10
Queue

****

J'ai pensé à utiliser sed mais je ne trouve pas la syntaxe pour récupérer les lignes comprises entre i et j.
Je suis sur que la solution est archi simple et c'est pour cela que je vous remercie par avance!

Bonne fin de journée!
Configuration: Windows XP
Firefox 2.0.0.14

7 réponses

  1. Flachy Joe Messages postés 2303 Statut Membre 261
     
    Et avec une combinaison de head et tail ?
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Non ça ne peut pas marcher. Il veut récupérer aussi des instructions en pleins milieu, ce que ne fait ni head ni tail.
      0
  2. Flachy Joe Messages postés 2303 Statut Membre 261
     
    Ben si.
    Exemple :
    Fichier de 20 lignes
    head prend les ligne 0 à 15
    on fait un tail sur le resultat qui prend les lignes 9 à la fin, c'est à dire 15
    on a donc les lignes 9 à 15 du fichier d'origine.
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Oui. Tu fais donc ce que sed peut faire en une instruction. Pratique
      0
  3. Flachy Joe Messages postés 2303 Statut Membre 261
     
    ah bon, ben en fait je connais pas sed.
    Mais si la syntaxe est compliquée, celle de head et tail est simple au possible...
    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
     sed 'a,b !d' fichier
    affiche sur la sortie standard les lignes 4, 5 et 6.
     head -n b fichier | tail -n $((b-a+1)) 
    pour le même résultat ;)
    0
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Une façon de faire :
    [tmpfs]$ ls -1
    fich.txt
    foo.sh*
    
    [tmpfs]$ cat fich.txt
    ligne1
    ligne2
    ligne3
    ligne4
    
    test1
    Queue
    test2
    Queue
    test3
    Queue
    test4
    Queue
    test5
    Queue
    test6
    Queue
    test7
    Queue
    test8
    Queue
    test9
    Queue
    test10
    Queue
    
    [tmpfs]$ cat foo.sh
    #! /bin/bash
    
    #set -xv
    
    var=$(sed -n 1,4p fich.txt)
    
    n=1
    i=1
    j=4
    fin=$(sed -n '/test/p' fich.txt | wc -l)
    
    while [ "$i" -le "$fin" ]
    do
    echo -e "${var}\n" > new_fich"${n}".txt
    sed -n "/test$i/,/test$j/ {N;p}" < fich.txt >> new_fich"${n}".txt
    ((n++))
    ((i+=4))
    ((j+=4))
    done
    
    [tmpfs]$ ./foo.sh
    
    [tmpfs]$ ls -1
    fich.txt
    foo.sh*
    new_fich1.txt
    new_fich2.txt
    new_fich3.txt
    
    [tmpfs]$ cat new_fich1.txt
    ligne1
    ligne2
    ligne3
    ligne4
    
    test1
    Queue
    test2
    Queue
    test3
    Queue
    test4
    Queue
    test10
    Queue
    [tmpfs]$ cat new_fich2.txt
    ligne1
    ligne2
    ligne3
    ligne4
    
    test5
    Queue
    test6
    Queue
    test7
    Queue
    test8
    Queue
    [tmpfs]$ cat new_fich3.txt
    ligne1
    ligne2
    ligne3
    ligne4
    
    test9
    Queue
    test10
    Queue
    [tmpfs]$
    ;-))
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Oups ;-((

      Il faut remplacer la ligne :
      sed -n "/test$i/,/test$j/ {N;p}" < fich.txt >> new_fich"${n}".txt
      par
      sed -n "/test$i\b/,/test$j\b/ {N;p}" < fich.txt >> new_fich"${n}".txt
      ;-))
      0
  7. ZZ2F3 Messages postés 40 Date d'inscription   Statut Membre
     
    Merci à tout le monde!

    J'ai fait un mix de tout ce que vous m'avez conseillé et j'arrive à un truc qui fonctionne!

    En tous cas, merci pour votre rapidité et votre efficacité ;)

    Bonne fin de journée!
    0