Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1656 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Aide avec SED

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Aide avec SED

n°1976991
sony97one
Posté le 24-03-2010 à 19:31:14  profilanswer
 

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

mood
Publicité
Posté le 24-03-2010 à 19:31:14  profilanswer
 

n°1977045
abaddon200​2
Posté le 24-03-2010 à 22:53:27  profilanswer
 

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

n°1977046
Elmoricq
Modérateur
Posté le 24-03-2010 à 23:06:26  profilanswer
 

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
n°1977073
sony97one
Posté le 25-03-2010 à 01:22:40  profilanswer
 

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)  
 

n°1977074
sony97one
Posté le 25-03-2010 à 01:23:48  profilanswer
 

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

n°1977076
sony97one
Posté le 25-03-2010 à 01:47:39  profilanswer
 

@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...

n°1977107
Elmoricq
Modérateur
Posté le 25-03-2010 à 09:38:43  profilanswer
 

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.

n°1977223
sony97one
Posté le 25-03-2010 à 12:19:43  profilanswer
 

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...

n°1977798
sony97one
Posté le 26-03-2010 à 15:24:01  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Aide avec SED

 

Sujets relatifs
Perl - Fichier Texte Sed[MATLAB] aide graphique loi binomiale :/
Aide pour modèle objet. moteur d'ordre?création de mon nouveau site. Besoin de vos lumieres
Lier un fichier .cfg à un fichier .exe à l'aide d'un fichier .batAide config email templat
Aide avec les chemins d'accès aux fichiersBESOIN AIDE FORMULAIRE PHP. HELP ME please
Probleme variable fichier [ langage C ] 
Plus de sujets relatifs à : Aide avec SED


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR