Extraire en bash les infos d'un fichier
viellepe
-
viellepe Messages postés 7 Statut Membre -
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
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:
- Extraire en bash les infos d'un fichier
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Extraire une video youtube - Guide
7 réponses
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 ?
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 ?
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
$
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
/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....
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
-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