Re: [ssfr] Découper un fichier (fortran) en suivant un schéma précis |
[ Thread Index |
Date Index
| More debianworld.org/shellscript-fr Archives
]
- To: shellscript-fr@xxxxxxxxxxxxxxx
- Subject: Re: [ssfr] Découper un fichier (fortran) en suivant un schéma précis
- From: JJL <buggerone@xxxxxxxxx>
- Date: Tue, 5 Jun 2012 14:25:33 +0200
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type:content-transfer-encoding; bh=GxMMpBBPCZpJ7RO7TQhioaIfQbUtZRoXFKtt1Ys9oLE=; b=SsmL4EbsnEtYj6GzDzpBtHBnAYY6z7eczAOXegtPEXIFkOHSD6CNptDS8a41BHzXtg soqIpa5kY4wxCKvFvUbdmi9P094P6ZgdMAZmnhoIZ2GbjSmnw1MkHNT1OFFuRDh4Bevf eOFXgdmMDY2D2cG1Y3UBr1eso07iI7ES0EUvbqfbotkDT8YFE0oYya7kAxE/GuhBkTLT RK9kZk20Eurjrexc6fxtLe/VMjF4j9bjxU37GEjvH2GCdkGQS6F2HWPdbCKjWT1/Gv6I Bx/+3UY8Fpl9nu39HRdb/LBdc7YsPqBx39Mve5RJFn7CFR9lBioXJNRJg3D8GRN63idz 4eQw==
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