Re: [ssfr] Découper un fichier (fortran) en suivant un schéma précis

[ Thread Index | Date Index | More debianworld.org/shellscript-fr Archives ]


Salut,

J'avais fait un script qui ressemblait un peu à ça pour merger des
fichiers spec rpm, si j'en extrait/adapte l'algo qui fait ce que tu
cherche, ça donne :

--8<----------------------------
#!/bin/bash

fin=$1
# create an array with lines number beginnig by % and last line+1
lines_n=( $(grep -En "^subroutine" $fin | cut -d: -f1; echo $(( $(wc
-l < $fin) + 1 )) ) )
if [ ${#lines_n[*]} -gt 0 ]
then
   # for c=0; c+1<len(lines_n) ; c++
   for (( c=0; $((c+1)) < ${#lines_n[*]}; c=$(($c + 1)) ))
   do
      l1=${lines_n[$c]} # line of subroutine
      l2=$(( ${lines_n[$(($c+1))]} - 1 )) # line before next subroutine or eof
      sed -n $l1,${l2}p ${fin} >> ${fin}.$c
   done
fi
--8<----------------------------

C'est assez illisible comme souvent les tableaux (avec en plus des
calculs d'indices) en bash :)
le principe est de stocker dans un tableau les numéros de lignes qui
contiennent le délimiteur de début de ta section (^subroutine)
C'est la ligne de grep au début
Ensuite tu parcours le tableau et tu en extrait les lignes comprise en
la ligne courante et celle d'avant la suivante.
Dans le script, l1 est la ligne courante (d'indice c) et l2 et la
ligne suivante (d'indice c+1) - 1
L'extraction est faite avec sed

Ce qui serait cool, c'est une option de grep comme -A mais qui match
sur une regex plutôt que sur un nombre de lignes, mais je n'avais pas
trouvé. Sinon, peut-être que des spécialistes de awk pourraient faire
ça plus proprement ?

À l’exécution avec tes données d'exemple, ça donne :

$ bash cutsub.sh in.txt
$ grep subr in.txt.?
in.txt.0:subroutine test1()
in.txt.1:subroutine test2()

++
JJL

Le 5 juin 2012 13:37, giggzounet <giggzounet@xxxxxxxxx> a écrit :
> Bonjour la liste,
>
> J'ai un programme fortran contenant de nombreux fichiers sources. Parmi ces
> fichiers sources certains contiennent plusieurs déclarations de subroutines:
> par exemple exemple.F contient:
> subroutine test1()
>
> end
>
> subroutine test2()
>
> end
>
> ...
>
> J'aimerais découper ce type de fichiers pour qu'en fin de compte je n'ai
> qu'une subroutine dans chaque fichier source. Et j aimerais faire ça dans un
> script.
>
> Avez vous des idées ?
>
> Merci d'avance,
> Guillaume



-- 
http://kubuntu.free.fr/blog



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/