Boucle for pour toutes les lignes d'un fichier

wtfunix Messages postés 52 Statut Membre -  
wtfunix Messages postés 52 Statut Membre -
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

4 réponses

  1. gnugo Messages postés 153 Date d'inscription   Statut Membre Dernière intervention   46
     
    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
  2. wtfunix Messages postés 52 Statut Membre
     
    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
  3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
     
    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
    1. Utilisateur anonyme
       
      salut,

      while read -a A
      directement ;)
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      Salut,

      Merci, mais pas tout d'un coup pour notre ami, le but etant qu'il lise un fichier ligne par ligne ;-\
      0
    3. Utilisateur anonyme
       
      c'est pareil, en plus simple : je ne passe pas par une variable
      ligne
      .
      0
    4. wtfunix Messages postés 52 Statut Membre
       
      Merci beaucoup pour les réponses ça marche maintenant !!! :D
      0