Extraire en bash les infos d'un fichier

viellepe -  
viellepe Messages postés 7 Statut Membre -
Bonjour,

Je demande votre aide car je ne suis pas assez compétent en bash pour faire ce que je veux. J'espere que quelques experts en sed, awk et compagnie pourront m'aider

J'ai une application qui me génère un fichier sous la forme suivante :

fichier.txt :
----------------table1
ligne vide
ligne A
ligne B
ligne vide
----------------table2
ligne vide
ligne C
ligne D
ligne E
ligne vide
----------------table3
ligne vide
ligne F
ligne G
ligne vide
----------------fin

les lignes A,B,C ... ne sont jamais vides et peuvent être plus nombreuses que dans mon exemple pour chaque table

J'aimerais un petit programme bash qui d'après ce fichier me construisent trois fichiers nommés table1.txt, table2.txt et table3.txt avec :

table1.txt:
ligne A
ligne B

table2.txt:
ligne C
ligne D
ligne E

table3.txt:
ligne F
ligne G

Je suis clairement incapable de faire ça avec mes maigres connaissances bash. Merci d'avance pour un éventuel bon samaritain qui peut me donner une commande capable de faire ce que je veux et quelques pistes car je pense que ce n'est pas simple

Merci et bonne journée
Configuration: Windows XP
Firefox 3.5.6

7 réponses

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

    Affiche ton fichier de départ tel qu'il est réellement...
    Je suppose que les "....tablex" n'existent pas, ni les pointillés ni le nom ?
    En fait le délimiteur naturel est une ligne blanche (ou 2 ?), exact ?
    0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    hello
    $ cat a2
    ----------------table1
    
    ligne A
    ligne B
    
    ----------------table2
    
    ligne C
    ligne D
    ligne E
    
    ----------------table3
    
    ligne F
    ligne G
    
    $ awk -F"-" '/table/ {fichier=$NF ".txt";next } ; $0 !~ /^$/ {print $0 > fichier}' < a2
    $ ls table*
    table1.txt  table2.txt	table3.txt
    $ more table*
    ::::::::::::::
    table1.txt
    ::::::::::::::
    ligne A
    ligne B
    ::::::::::::::
    table2.txt
    ::::::::::::::
    ligne C
    ligne D
    ligne E
    ::::::::::::::
    table3.txt
    ::::::::::::::
    ligne F
    ligne G
    $ 
    
    0
  3. viellepe Messages postés 7 Statut Membre
     
    merci à tous les deux pour vos réponses

    en fait, mon fichier c'est ca :

    ---heure-------------------LINKS

    IP adress hyst LQ ....
    0.0.0.0 0 0 ...
    1.1.1.1 0 0 ...

    --- heure -------------------NEIGHBORS

    IP adress LQ NLQ ....
    0.0.0.0 0 0 ...
    1.1.1.1 0 0 ...

    --- heure -------------------TWO-HOP NEIGHBORS

    IP adress (2hop) ...
    0.0.0.0.....
    1.1.1.1....

    --- heure -------------------TOPOLOGY

    Source IP addr
    0.0.0.0 ....
    1.1.1.1 ....

    Ca aurait été effectivement plus intelligent de vous donner le vrai format du fichier directement. Pardon pour ma bêtise. Pour ceux qui reconnaissent, c'est la sortie sur terminal du protocole olsrd qui tourne sur ma machine. Malheureusement, il n'y a pas moyen d'accéder aux tables que construit olsrd, je dois les tirer de l'écran

    ta commande a l'air intéressante dubcek, peux tu expliciter un peu plus, merci
    0
  4. lami20j
     
    Salut,

    Essaie
    awk -F"-" '/-/ {fichier=$NF ".txt";next } ; NF{print $0 > fichier}' < ton_fichier
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    je bricole un peu à cause du - dans TWO-HOP NEIGHBORS
    /heure/ {fichier=$NF ".txt";sub("^-","",fichier);next } on prend le dernier champ de chaque ligne qui contient heure, on enlève le premier - , on ajoute .txt, on sauve dans la variable fichier et on passe à la ligne suivante
    $0 !~ /^$/ {print $0 > fichier}' pour chaque ligne non-vide, on l'imprime dans un fichier dont le nom est la variable fichier
    $ awk -F"--" '/heure/ {fichier=$NF ".txt";sub("^-","",fichier);next } ; $0 !~ /^$/ {print $0 > fichier}' < ../a2
    $  ls
    LINKS.txt  NEIGHBORS.txt  TOPOLOGY.txt	TWO-HOP NEIGHBORS.txt
    $ more *
    ::::::::::::::
    LINKS.txt
    ::::::::::::::
    IP adress hyst LQ ....
    0.0.0.0 0 0 ...
    1.1.1.1 0 0 ...
    ::::::::::::::
    NEIGHBORS.txt
    ::::::::::::::
    IP adress LQ NLQ ....
    0.0.0.0 0 0 ...
    1.1.1.1 0 0 ...
    ::::::::::::::
    TOPOLOGY.txt
    ::::::::::::::
    Source IP addr
    0.0.0.0 ....
    1.1.1.1 .... 
    ::::::::::::::
    TWO-HOP NEIGHBORS.txt
    ::::::::::::::
    IP adress (2hop) ...
    0.0.0.0.....
    1.1.1.1....
    
    0
    1. lami20j
       
      Salut,

      Je bricole un peu à cause du - dans TWO-HOP NEIGHBORS
      Oups, celui-là je ne l'ai pas vu ;-)
      0
  7. lami20j
     
    Re,

    -F"-" - le séparateur des champs est le tiret

    '/-/ {fichier=$NF ".txt";next } ;
    Pour toutes les lignes qui contiennent un tiret on sauvegarde dans la variable fichier le dernier champs et on concatène avec l'extension .txt

    NF{print $0 > fichier}


    Si le nombre de champs est vrai (c'est la variable NF qui contient le nombre de champs) donc s'il y a des champs (une ligne vide n'a aucun champ) on écrit la ligne dans fichier
    0
  8. viellepe Messages postés 7 Statut Membre
     
    merci beaucoup, vous êtes géniaux
    je test cela lundi, le week-end s'impose ...

    Bonne fin de semaine
    0