Boucle for pour toutes les lignes d'un fichier

Fermé
wtfunix Messages postés 48 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 25 août 2014 - 31 juil. 2014 à 16:44
wtfunix Messages postés 48 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 25 août 2014 - 1 août 2014 à 12:52
Bonjour,
j'aimerai savoir comment réaliser une boucle "for" sur toutes les lignes d'un fichier. Mon problème est que je ne sais pas comment syntaxer la boucle j'ai essayer plusieurs méthodes que j'ai chercher sur internet mais ça ne marche pas donc je pense que je dois mal m'y prendre :/. Le but étant de réaliser le programme suivant pour chaque ligne du fichier afin qu'il m'affiche consécutivement les résultats.

Voila mon programme :

ligne='sed -n ${1}p f3'
asteroid='echo $ligne| awk '{print $1"_"$2}''
date1="${2}T00:00:00"
date2='echo $ligne| awk '{print $3"-"$4"-"$5}''
date3='echo $date2$date1'
step="5min"
nbstep="300"

echo "nom asteroide:" $asteroid
echo " date:" $date1
echo " date:" $date2
echo " date:" $date3
echo "step:" $step#echo "nombre de step:"$nbstep

curl "http://vo.imcce.fr/webservices/miriade/ephemcc/?-name=$asteroid&-type=aster&-ep=$date3&-nbd=$nbstep&-step=$step&-tcoor=1&-mime=text" > fic
echo "fin de step 1"

sed '/#/d' fic > fic1

cat fic1 | sort -k 8 > fic2

line=$(head -n 2 fic2)
echo $line

echo "fin de step 2"

voila donc ce programme marche pour la première ligne cependant pour n ligne je devrai rajouter :

nblign='wc -l f3 | awk '{print $1}''

for ((i=1; i<=$nblign; i++)); do
...
done


et remplacer le "1" dans ligne='sed -n ${1}p f3' par un "i" ce qui me donnerai : ligne='sed -n ${i}p f3'

Mais bon voila le programme ne fonctionne pas...



Merci d'avance
A voir également:

4 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
31 juil. 2014 à 16:47
0
gnugo Messages postés 145 Date d'inscription lundi 6 septembre 2010 Statut Membre Dernière intervention 8 décembre 2014 46
Modifié par gnugo le 31/07/2014 à 19:41
Il faudrait aussi que tu nous donnes un exemple de comment tu appelles ton script (paramètres), et comment tu comptes l'appeler quand il sera devenu multiligne
0
wtfunix Messages postés 48 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 25 août 2014
Modifié par jipicy le 1/08/2014 à 10:32
Au tout début je suis partie sur une exemple où le programme me donner bien le résultat :
asteroid="2013_WT67"
date1="2014-8-17T00:00:00"
step="5min"
nbstep="300"

echo $asteroid
echo $date1
echo $step
echo $nbstep

curl "[http://vo.imcce.fr/webservices/miriade/ephemcc/?-name=]$asteroid&-type=aster&-ep=$date1&-nbd=$nbstep&-step=$step&-tcoor=1&-mime=text" > fictemp
echo "fin de step 1"

sed '/#/d' fictemp > fictemp2

#cat fictemp2 | sort -n -k 8 > fictemp3

cat fictemp2 | sort -k 8 > fictemp3

line=$(head -n 2 fictemp3)
echo $line

echo "fin de step 2"

Du coup, j'ai voulu effectuer la même chose pour le fichier paramètres suivant, ce fichier s'apelle f3:

2014 MJ26 2014 07 02 0.0249
2014 MF6 2014 07 09 0.0233
2014 MS5 2014 07 13 0.0449
2011 PU1 2014 07 17 0.0201
2014 MV41 2014 07 17 0.0273
2014 MA6 2014 07 23 0.0486
3981 88 2014 08 12 0.0399
2005 CD69 2014 08 14 0.0187
2014 MP5 2014 08 16 0.0451
1631 32 2014 08 30 0.0347
2011 PT 2014 10 03 0.0454
2011 TB4 2014 10 09 0.0134
2009 TD8 2014 10 27 0.0265

Cependant, afin d'avoir la même forme j 'ai du modifier le code et je l'ai tester pour la première ligne seulement, comme le montre le preogramme en dessous :

ligne='sed -n ${1}p f3'
asteroid='echo $ligne| awk '{print $1"_"$2}''
date1="${2}T00:00:00"
date2='echo $ligne| awk '{print $3"-"$4"-"$5}''
date3='echo $date2$date1'
step="5min"
nbstep="300"

echo "nom asteroide:" $asteroid
echo " date:" $date1
echo " date:" $date2
echo " date:" $date3
echo "step:" $step
echo "nombre de step:"$nbstep

curl "[http://vo.imcce.fr/webservices/miriade/ephemcc/?-name=]$asteroid&-type=aster&-ep=$date3&-nbd=$nbstep&-step=$step&-tcoor=1&-mime=text" > fic
echo "fin de step 1"

sed '/#/d' fic > fic1

cat fic1 | sort -k 8 > fic2

line=$(head -n 2 fic2)
echo $line

echo "fin de step 2"

Je ne sais pas comment effectuer la même chose pour tout le fichier f3 ..
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
1 août 2014 à 10:51
Salut,

Tiens, voilà un exemple de lecture de fichier ligne par ligne en prenant tes exemples. Note que j'ai bêtement copié tes variables date, ce qui affiche quelques incohérences ;-\

$ cat f3
2014 MJ26 2014 07 02 0.0249
2014 MF6 2014 07 09 0.0233
2014 MS5 2014 07 13 0.0449
2011 PU1 2014 07 17 0.0201
2014 MV41 2014 07 17 0.0273
2014 MA6 2014 07 23 0.0486
3981 88 2014 08 12 0.0399
2005 CD69 2014 08 14 0.0187
2014 MP5 2014 08 16 0.0451
1631 32 2014 08 30 0.0347
2011 PT 2014 10 03 0.0454
2011 TB4 2014 10 09 0.0134
2009 TD8 2014 10 27 0.0265

$ cat foo.sh
#! /bin/bash

step="5min"
nbstep="300"

while read line
do
A=( ${line} )

echo " nom asteroide: ${A[0]}_${A[1]}"
echo " date: ${A[2]}T00:00:00"
echo " date: ${A[2]}-${A[3]}-${A[4]}"
echo " date: ${A[2]}-${A[3]}-${A[4]}${A[2]}T00:00:00"
echo " step: ${step}"
echo " nombre de step: ${nbstep}"
echo
done < f3

$ ./foo.sh
nom asteroide: 2014_MJ26
date: 2014T00:00:00
date: 2014-07-02
date: 2014-07-022014T00:00:00
step: 5min
nombre de step: 300

nom asteroide: 2014_MF6
date: 2014T00:00:00
date: 2014-07-09
date: 2014-07-092014T00:00:00
step: 5min
nombre de step: 300

nom asteroide: 2014_MS5
date: 2014T00:00:00
date: 2014-07-13
date: 2014-07-132014T00:00:00
step: 5min
nombre de step: 300

nom asteroide: 2011_PU1
date: 2014T00:00:00
date: 2014-07-17
date: 2014-07-172014T00:00:00
step: 5min
nombre de step: 300

nom asteroide: 2014_MV41
date: 2014T00:00:00
date: 2014-07-17
date: 2014-07-172014T00:00:00
step: 5min
nombre de step: 300

nom asteroide: 2014_MA6
date: 2014T00:00:00
date: 2014-07-23
date: 2014-07-232014T00:00:00
step: 5min
nombre de step: 300

nom asteroide: 3981_88
date: 2014T00:00:00
date: 2014-08-12
date: 2014-08-122014T00:00:00
step: 5min
nombre de step: 300

nom asteroide: 2005_CD69
date: 2014T00:00:00
date: 2014-08-14
date: 2014-08-142014T00:00:00
step: 5min
nombre de step: 300

nom asteroide: 2014_MP5
date: 2014T00:00:00
date: 2014-08-16
date: 2014-08-162014T00:00:00
step: 5min
nombre de step: 300

nom asteroide: 1631_32
date: 2014T00:00:00
date: 2014-08-30
date: 2014-08-302014T00:00:00
step: 5min
nombre de step: 300

nom asteroide: 2011_PT
date: 2014T00:00:00
date: 2014-10-03
date: 2014-10-032014T00:00:00
step: 5min
nombre de step: 300

nom asteroide: 2011_TB4
date: 2014T00:00:00
date: 2014-10-09
date: 2014-10-092014T00:00:00
step: 5min
nombre de step: 300

nom asteroide: 2009_TD8
date: 2014T00:00:00
date: 2014-10-27
date: 2014-10-272014T00:00:00
step: 5min
nombre de step: 300
0
salut,

while read -a A
directement ;)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
1 août 2014 à 11:28
Salut,

Merci, mais pas tout d'un coup pour notre ami, le but etant qu'il lise un fichier ligne par ligne ;-\
0
c'est pareil, en plus simple : je ne passe pas par une variable
ligne
.
0
wtfunix Messages postés 48 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 25 août 2014
Modifié par wtfunix le 1/08/2014 à 13:22
Merci beaucoup pour les réponses ça marche maintenant !!! :D
0