Un fichier par paragraphe

plebeien -  
 plebeien -
Bonjour,

je possède un fichier tex ou chaque paragraphe est délimité par une ligne vierge et pour lequel j'aimerais que chaque paragraphe devienne un fichier spécifique suivant la nomenclature suivante :

paragraphe 1 > fichier 1
paragraphe 2 > fichier 3
paragraphe 3 > fichier 5
etc

Je cherche à le faire à partir de awk mais n'importe quel outil fera j'imagine l'affaire.
je n'ai que quelques briques à ma disposition pour l'heure car je ne possède absolument pas les compétences nécessaires pour porter avant le problème.

Si quelqu'un a une piste à me proposer, j'imagine qu'une variable quelconque et une boucle sera nécessaire mais je ne vois vraiment pas comment implémenter le tout.

Merci
A voir également:

5 réponses

dubcek Messages postés 19032 Date d'inscription   Statut Contributeur Dernière intervention   5 641
 
pour avoir une valeur 001 il faut utiliser le format %03d avec printf ou sprintf
bb=sprintf("%03d", b);
print $a > "fichier"bb

tu peux créer une fonction et passer a et b en paramètres
function foo(a, b, c) { ...; return x }
1
plebeien
 
parfait pour la première partie, ça marche du tonnerre et ça résout le plus gros problème pour la deuxième partie, je n'ai pas tout compris mais c'est parce que je manque de connaissances dans la création de fonctions fondamentalement. Une petite suggestion de doc intéressante dans le domaine ? (livre ou site bien fait ?)

En tout cas merci Dubcek pour les deux réponses.
0
dubcek Messages postés 19032 Date d'inscription   Statut Contributeur Dernière intervention   5 641
 
hello
csplit -f fichier fichier.txt "/^$/" {*}
crée fichier01, fichier02, etc
0
plebeien
 
Salut Dubcek, je ne connais pas csplit mais j'ai jeté un coup d'œil rapide à son man histoire de ne pas mourrir idiot. Il ne répond pas (en tout cas dans l'exemple que tu proposes) à mon problème puisqu'il n'offre qu'une sortie incrémentale directe des numéros de fichiers. C'est dommage, ça a l'air d'être un petit outil bien pratique.

De mon côté, en tentant de comprendre (et d'apprendre par la même occasion plein d'autres choses) un peu mieux AWK, j'en suis arrivé à pondre la chose suivante qui ne fonctionne pas mal si ce n'est que le format de sortie est de type fichier1, fichier11, fichier123 puis seulement fichier3, etc. Quand je vais faire mon cat, je sens (c'est déjà le cas) que ça va merder.

Voilà ma solution AWK au cas où ça peut servir pour me dépanner ou autre :

awk 'BEGIN{RS="\begin{document}";FS="\n\n+"}
{a=1
b=1
while(a<NF){
print $a > "fichier"b
a++
b=b+2
}
}' le_fichier_analyse

En fait, en l'état j'aimerai savoir si on peut avoir quelque chose du type fichier001 au lieu de fichier1 ou fichier010 au lieu de fichier10.

Ensuite (et j'en profite) j'aimerais savoir si l'on peut donner des valeurs à "a" et "b" en dehors de la fonction parce que j'aimerais automatisé tout cela en créant une petite fonction dont les arguments seraient justement ces deux variables et le fichier (ou les fichiers à traiter).

Je sais ça fait beaucoup :p mais bon, je ne sais pas faire !!! Va falloir penser à lire un peu de livres peut-être me dira-t-on !!! :D
0
dubcek Messages postés 19032 Date d'inscription   Statut Contributeur Dernière intervention   5 641
 
je n'ai pas exactement compris ta 2ème queston
dans une fonction awk ou shell, je peux passer des paramètres à l'appel de la fonction et les utiliser dans la fonction, c'est ça que tu veux ?
0
plebeien
 
En fait le script awk était le plus gros du boulot pour ce que je dois faire dans l'immédiat. À terme, parce que je referai ce genre d'opérations plus ou moins régulièrement, il me faudrait créer un programme plus complet avec création d'un répertoire temporaire, l'opération awk ci-dessus et concaténation des fichiers résultants ainsi que déplacement de fichiers et destruction de tout le toutim intermédiaire. Bon, c'est à plus long terme comme idée.

Disons que dans cette perspective, je voudrais créer au sein du script, une fonction contenant la commande awk ci-dessus et pouvoir changer la valeur des variables pour pouvoir les réappliquer à différents fichiers et rendre le tout plus simple à gérer. Mais bon ça demande du boulot, parce que je ne connais, absolument, pas grand chose à la création de fonctions dans un script et que je ne veux pas juste aligner une suite de commandes adaptées individuellement à un cas de figure. Ça me semblerait alors d'un lourd, et j'aurais tout aussi bien le temps de faire ça directement dans le shell. Mais bon, je ne suis pas encore assez calé pour faire tout ça et dans l'immédiat, ça ne m'est plus utile. Mais je le répète, il faudra que je le fasse :D

Du coup, s'il existe de la bonne doc pour se former un peu aux scripts shell, globalement, mais aussi dans la création de choses avancées, pas simplement ce qu'on trouve en général sur le net avec des exemples tellement basiques qu'on se demande bien quoi en faire à part comprendre la syntaxe à employer... Et bien je suis preneur !!!

En tout cas merci de la réponse rapide
0
asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
 
Et- si tu abandonne awk ?

Le script suivant semble fair l'affaire, et changer le numero de départ, l'increment, le format, (voire le separateur) est simplissime...
prefix=fic_
suffix=0
increment=2
format='%03d'
while read ligne
do
fichier=$prefix$(printf $format $suffix)
echo $ligne |grep -v "^$" >> $fichier || suffix=$(($suffix + $increment)) 
done < test.txt

0
plebeien > asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention  
 
Salut Asevere,

je suis sur le cul, tellement la chose semble simple... j'ai créé mon petit script en y insérant ce que tu m'as donné et en plaçant à la place de test.txt $1 et ça marche du tonnerre. En tout cas pour la partie je taille du fichier. Cool, j'apprends plein de choses, je suis très content.

Par contre, petite question. Dans ma petite commande Awk, je peux placer des petits éléments en plus (saut de ligne, tabulation, commandes latex, etc) au niveau du print $a --> print $a"\n" || print "\\begin{quote}"$a"\\end{quote}". Dans ta fonction je vois mal comment, mais je serais intéressé de savoir s'il y a possibilité et comment ? Faut-il faire sauter l'ensemble pour le reconstruire autrement ou peut-on y rajouter un élément simplement ?

Merci de ta réponse en tout cas, éclairante sur les possibilités du shell et de grep, ça me souffle.
0
asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   426 > plebeien
 
Ha...
Là, c'est un autre problème.

Je dirais que c'est faisable, avec sed entre autres (puisque tu ne vas traiter à ce moment là qu'une seule ligne) mais je n'ai pas le temps de tester ça là...

Si une bonne âme passe par là! :)
0

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

Posez votre question
plebeien
 
C'est en tout cas bien sympa. Merci encore
0