Aide avec SED

Aide avec SED - Shell/Batch - Programmation

Marsh Posté le 24-03-2010 à 19:31:14    

Salut,
 
J'ai un prob avec la commande SED.
 
J'ai un programme fortran a exécuté sur une centaine de fichier. Donc je suis amené a modifier le nom du fichier d'entrée dans ce programme fortran.
J'ai donc fait ce petit script qui lit le nom du fichier *.dat et créé un fichier de sortie *.txt.
 
Mon probleme c'est qu'il n'écrit pas les noms quand je fais:
sed -i "11 s/\(.*=\).*/\1$m)/" pickout.f
sed -i "12 s/\(.*=\).*/\1$n)/" pickout.f
 
Votre sera très appréciable
 
MERCI!!!
 
***************
***************
Voici mon script:
 
#! /bin/bash
 
for file in *.dat
do
 
n=$ echo $file
m=$ echo "$file" | sed "s/dat/txt/"
 
 
echo $n
echo $m
 
sed -i "11 s/\(.*=\).*/\1$m)/" pickout.f
sed -i "12 s/\(.*=\).*/\1$n)/" pickout.f
 
f77 pickout.f -o pickout
./pickout
 
done
******************
******************
et mon prog fortran pickout.f :
 
      PROGRAM pickout
      INTEGER ilig, icol, idimlig, idimcol
      DIMENSION rad(2399)
c     Entrer la dimension colonne-ligne des images.
      idimcol=2399
      idimlig=1674
c     Entrer la position colonne-ligne de la cible.
      icol=870
      ilig=906
c     Lecture images et ecriture tableau.
(11)     OPEN(4,FILE=)
(12)     OPEN(1,FILE=)
     &ACCESS='direct',RECL=4*idimcol,FORM='unformatted',STATUS=)
      DO k=ilig-2,ilig+2
      READ(1,REC=k) (rad(ic),ic=1,idimcol)
      WRITE(4,100) (rad(ic),ic=icol-2,icol+2)
      ENDDO  
 100  format(5(F9.4,x))
      CLOSE(1)
      CLOSE(4)
      END

Reply

Marsh Posté le 24-03-2010 à 19:31:14   

Reply

Marsh Posté le 24-03-2010 à 22:53:27    

salut,
 
tu veux faire quoi exactement comme modification avec tes sed -i ?

Reply

Marsh Posté le 24-03-2010 à 23:06:26    

Si j'ai bien compris : tu as un programme fortran, qui prend un fichier .dat avec le descripteur 1 en entrée, et sort un fichier .txt (descripteur 4). Et tu veux appliquer ce programme sur tous les fichiers *.dat

 

Je te propose un truc du genre (à tester) :


for filein in *.dat
do
   export fileout=$(echo $filein | sed 's/\.dat/\.txt/')
   perl -pe '
s{(1,FILE=)}{$1$ENV{filein}};
s{(4,FILE=)}{$1$ENV{fileout}}' pickout.f > pickout_modified.f
   f77 pickout_modified.f -o pickout
   ./pickout
done

 

Je n'ai pas utilisé perl par snobbisme, juste je trouve les regexp PCRE plus confortables que les POSIX, et perl est à priori livré en standard sur unix.

 

D'autre part, il peut être judicieux de faire en sorte que ton code fortran prenne les noms de fichier entrée et sortie en paramètre. Ce serait quand même vachement plus pratique.


Message édité par Elmoricq le 24-03-2010 à 23:08:46
Reply

Marsh Posté le 25-03-2010 à 01:22:40    

SAlut merci pour vos réponse.
 
@abaddon2002: Je veux que dans le prog fortran
((11) et (12) sont mis en clairs pour indiquer les n° de lignes)
 
(11)     OPEN(4,FILE=)  
(12)     OPEN(1,FILE=)  
 
et apres le SED avoir:
(11)     OPEN(4,FILE=$m)  
(12)     OPEN(1,FILE=$n)  
 
avec $n le nom du fichier lu (en *.dat) et $m le nom du fichier modifier (en *.txt)
 
en faisant
echo $n  
echo $m  
 
les variables ont les bonnes valeurs.
 
mais a l'écriture
 
sed -i "11 s/\(.*=\).*/\1$m)/" pickout.f  
sed -i "12 s/\(.*=\).*/\1$n)/" pickout.f  
 
rien ne se passe...
 
Je dois avoir mal écrit mon sed...
 
j'ai fais un test introduisant
 
read nb=30
sed -i "11 s/\(.*=\).*/\1$nb)/" pickout.f
 
et la ca marche
 
j'avais bien  
(11)     OPEN(4,FILE=30)  
 

Reply

Marsh Posté le 25-03-2010 à 01:23:48    

@Elmoricq: Merci de ta réponse je vais tester mais j'aimerais comprendre pourquoi à l'instruction cela ne marche pas.
 
Merci encore

Reply

Marsh Posté le 25-03-2010 à 01:47:39    

@Elmoricq: j'ai testé (copiez-collez de ton code) mais ca ne marche pas...
 
Il y a 96 fichiers a traiter et je ne saurais entrée les noms des 96 fichiers dans le code fortran...
 
Avec le script je cela devient plus facile...

Reply

Marsh Posté le 25-03-2010 à 09:38:43    

sony97one a écrit :

@Elmoricq: j'ai testé (copiez-collez de ton code) mais ca ne marche pas...


 
Tu es trop précis dans ta description d'erreur, peux-tu être un peu plus vague ?
 

sony97one a écrit :

Il y a 96 fichiers a traiter et je ne saurais entrée les noms des 96 fichiers dans le code fortran...


 
Non mais quand je parle de paramètre, c'est de faire en sorte que pickout prenne 2 paramètres quand tu l'invoques en ligne de commande (donc une fois compilé, quand tu as le binaire quoi), comme ça tu n'aurais plus à bidouiller le code source.

Reply

Marsh Posté le 25-03-2010 à 12:19:43    

voici les erreurs:
 
/usr/bin/f77: aborting compilation
./seviri2.sh: line 8: ./pickout: Aucun fichier ou dossier de ce type
   MAIN pickout:
Error on line 11: syntax error
Error on line 12: unbalanced parentheses, statement skipped
 
je pense que le script n'écrit pas le nom du fichier dans le prog fortran...

Reply

Marsh Posté le 26-03-2010 à 15:24:01    

voici la solution en shell:
 
#! /bin/bash
 
for file in *.dat
do
 
n=$file
m=$(echo "$file" | sed "s/dat/txt/" )
 
sed -i "11 s/\(.*=\).*/\1'"$m"')/" pickout.f
sed -i "12 s/\(.*=\).*/\1'"$n"',/" pickout.f
 
f77 pickout.f -o pickout
./pickout
 
done

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed