Aide avec SED - Shell/Batch - Programmation
Marsh Posté le 24-03-2010 à 22:53:27
salut,
tu veux faire quoi exactement comme modification avec tes sed -i ?
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) :
|
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.
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)
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
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...
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.
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...
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
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