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
A voir également:

7 réponses

jipicy Messages postés 41342 Statut Modérateur 4 896
 
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
dubcek Messages postés 19021 Statut Contributeur 5 637
 
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
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
lami20j
 
Salut,

Essaie
awk -F"-" '/-/ {fichier=$NF ".txt";next } ; NF{print $0 > fichier}' < ton_fichier
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 19021 Statut Contributeur 5 637
 
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
lami20j
 
Salut,

Je bricole un peu à cause du - dans TWO-HOP NEIGHBORS
Oups, celui-là je ne l'ai pas vu ;-)
0
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
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