Menu

Bash ne lit pas toutes les lignes [Résolu/Fermé]

Messages postés
19
Date d'inscription
vendredi 13 avril 2018
Statut
Membre
Dernière intervention
22 mai 2019
-
Bonjour,

J'ai écris un script qui exécute des actions ligne par ligne d'un fichier. Il fonctionne bien cependant, quand il s'agit d'un fichier contenant 70 ligne il marche mais quand le fichier fait une centaine de ligne il ne fonctionne plus.... Une solution pour régler le problèmes ? Cordialement

old_IFS=$IFS # sauvegarde du séparateur de champ
IFS=$'\n' # nouveau séparateur de champ, le caractère fin de ligne

for line in $(cat $1.csv)
do
 #echo "$line"
 #res=`grep "$line" $1.csv | awk -F';' '{print $10}'`
 #echo "$res"
 #TOTO=`grep "ligne" $1.csv | awk -F';' '{print $10}'`
 an=$(grep "$line" $1.csv | awk -F';' '{print $10}')
 #echo "Le résultat est $an"
 
 if [ $an != "NA" ]
 then
        o=$(grep "$an" BD.csv | awk -F';' '{print $8 " (by inference);" $9 " (by inference)"}')
        #echo "$o"
        if test -n "$o"
  then
   echo "$o"
  else
   ae=$(grep "$line" $1.csv | awk -F';' '{print $11}')
   #echo "2emm $ae"
   if [ $ae != "NA" ]
   then
    i=$(grep "$ae" BD.csv | awk -F';' '{print $8 " (by inference);" $9 " (by inference)"}')
    #echo "$i"
    if test -n "$i"
    then
     echo "$i"
    else
     cu=$(grep "$line" $1.csv | awk -F';' '{print $12}')
     #echo "3emmmme $cu"
     if [ $cu != "NA" ]
     then
      c=$(grep "$cu" BD.csv | awk -F';' '{print $8 " (by inference);" $9 " (by inference)"}')
      #echo "$c"
      if test -n "$c"
      then
       echo "$c"
      else
       echo "NA;NA"
      fi
     fi
    fi
   else
    w=$(grep "$line" $1.csv | awk -F';' '{print $12}')
    #echo "4emmmme $w"
    if [ $w != "NA" ]
    then
     z=$(grep "$w" BD.csv | awk -F';' '{print $8 " (by inference);" $9 " (by inference)"}')
     #echo "$z"
     if test -n "$z"
     then
      echo "$z"
     else
       echo "NA;NA"
     fi
    fi
   fi
  fi
    else
  n=$(grep "$line" $1.csv | awk -F';' '{print $11}')
  #echo "2emm $n"
  if [ $n != "NA" ]
  then
   h=$(grep "$n" BD.csv | awk -F';' '{print $8 " (by inference);" $9 " (by inference)"}')
   #echo "$h"
   if test -n "$h"
   then
    echo "$h"
   else
    l=$(grep "$line" $1.csv | awk -F';' '{print $12}')
    #echo "3emmmme $cu"
    if [ $l != "NA" ]
    then
     m=$(grep "$l" BD.csv | awk -F';' '{print $8 " (by inference);" $9 " (by inference)"}')
     #echo "$m"
     if test -n "$m"
     then
      echo "$m"
     else
      echo "NA;NA"
     fi
    fi
   fi
  else
   u=$(grep "$line" $1.csv | awk -F';' '{print $12}')
   #echo "4emmmme $u"
   if [ $u != "NA" ]
   then
    v=$(grep "$u" BD.csv | awk -F';' '{print $8 " (by inference);" $9 " (by inference)"}')
    #echo "$v"
    if test -n "$v"
    then
     echo "$v"
    else
      echo "NA;NA"
    fi
   fi
  fi
 fi
done

IFS=$old_IFS # rétablissement du séparateur de champ par défaut



j'ai également essayé avec while et for line in $(<$fichier) mais même problème
Afficher la suite 

2 réponses

Messages postés
36532
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
26 mai 2019
3557
0
Merci
Salut,

Si tu nous expliquais ce qu'est censé faire ton script, à défaut de nous fournir le fichier d'entrée, peut-être serions-nous à même de t'aider ;-\

À partir du moment où tu veux lire un fichier ligne par ligne, inutile de modifier la variable
IFS
(sauf emploi d'une boucle
for
, ce qui me paraît inadapté à ton cas) ;-(

De même une boucle
while… read
serait plus adaptée ici (sous réserve d'en savoir un peu plus)

irishupk
Messages postés
19
Date d'inscription
vendredi 13 avril 2018
Statut
Membre
Dernière intervention
22 mai 2019
-
Le problème de l'aide donnée sur developper et que la ligne donnée disait, pour un même nom trouvé et non trouvé et donc affichait les colonne 8 et 9 et NA;NA pour un même nom...

Là, j'ai cerné le problème, reste à le résoudre. Je crois qu'il n'arrive pas à faire la condition si il le nom n'a pas de correspondance dans BD.csv.

Merci de m'avoir donné un peu de votre temps ! :)
irishupk
Messages postés
19
Date d'inscription
vendredi 13 avril 2018
Statut
Membre
Dernière intervention
22 mai 2019
-
Je vous remercie du temps que vous m'avez consacré ! J'ai réussit à le faire marché entièrement et parfaitement Merci !
zipe31
Messages postés
36532
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
26 mai 2019
3557 > irishupk
Messages postés
19
Date d'inscription
vendredi 13 avril 2018
Statut
Membre
Dernière intervention
22 mai 2019
-
Happy for you, mais poster la solution eut été encore mieux ;-\
irishupk
Messages postés
19
Date d'inscription
vendredi 13 avril 2018
Statut
Membre
Dernière intervention
22 mai 2019
> irishupk
Messages postés
19
Date d'inscription
vendredi 13 avril 2018
Statut
Membre
Dernière intervention
22 mai 2019
-
D'accord pas de soucis ! je ne savais pas que cela était très "important" car il ne manquait que quelques phrases interne aux conditions. Ce manque était de ma faute ^^ Mais je poste la réponse :


while read line
do
#echo "$line"
 #res=`grep "$line" $1.csv | awk -F';' '{print $10}'`
 #echo "$res"
 #TOTO=`grep "ligne" $1.csv | awk -F';' '{print $10}'`
 an=$(grep "$line" $1.csv | awk -F';' '{print $10}')

 if [ $an != "NA" ]
 then
        o=$(grep "$an" BD.csv | awk -F';' '{print $8 " (by inference);" $9 " (by inference);"}')
        #echo "$o"
        if test -n "$o"
  then
   #echo "$an"
   echo "$o"
  else
   ae=$(grep "$line" $1.csv | awk -F';' '{print $11}')
   
   if [ $ae != "NA" ]
   then
    i=$(grep "$ae" BD.csv | awk -F';' '{print $8 " (by inference);" $9 " (by inference);"}')
    #echo "$i"
    if test -n "$i"
    then
     #echo "$ae"
     echo "$i"
    else
     cu=$(grep "$line" $1.csv | awk -F';' '{print $12}')  
     if [ $cu != "NA" ]
     then
      c=$(grep "$cu" BD.csv | awk -F';' '{print $8 " (by inference);" $9 " (by inference);"}')
      #echo "$c"
      if test -n "$c"
      then
       #echo "$cu"
       echo "$c"
      else
       #echo "$cu"
       echo "NA;NA;"
      fi
     else
      #echo "$cu"
      echo "NA;NA;"
     fi
    fi
   else
    w=$(grep "$line" $1.csv | awk -F';' '{print $12}')
    
    if [ $w != "NA" ]
    then
     z=$(grep "$w" BD.csv | awk -F';' '{print $8 " (by inference);" $9 " (by inference);"}')
     #echo "$z"
     if test -n "$z"
     then
      #echo "$w"
      echo "$z"
     else
      #echo "$w"
       echo "NA;NA;"
     fi
    else
     #echo "$w"
     echo "NA;NA;"
    fi
   fi
  fi
    else
  n=$(grep "$line" $1.csv | awk -F';' '{print $11}')
  #echo "$n"
  if [ $n != "NA" ]
  then
   h=$(grep "$n" BD.csv | awk -F';' '{print $8 " (by inference);" $9 " (by inference);"}')
   #echo "$h"
   if test -n "$h"
   then
    #echo "$n"
    echo "$h"
   else
    l=$(grep "$line" $1.csv | awk -F';' '{print $12}')
    #echo "$l"
    if [ $l != "NA" ]
    then
     m=$(grep "$l" BD.csv | awk -F';' '{print $8 " (by inference);" $9 " (by inference);"}')
     #echo "$m"
     if test -n "$m"
     then
      #echo "$l"
      echo "$m"
     else
      #echo "$l"
      echo "NA;NA;"
     fi
    else
     #echo "$l"
     echo "NA;NA;"
    fi
   fi
  else
   u=$(grep "$line" $1.csv | awk -F';' '{print $12}')
   if [ $u != "NA" ]
   then
    v=$(grep "$u" BD.csv | awk -F';' '{print $8 " (by inference);" $9 " (by inference);"}')
    #echo "$v"
    if test -n "$v"
    then
     #echo "$u"
     echo "$v"
    else
     #echo "$u"
      echo "NA;NA;"
    fi
   else
    #echo "$u"
    echo "NA;NA;"
   fi
  fi
 fi
done < $1.csv



Encore merci d'avoir voulu m'aider !
zipe31
Messages postés
36532
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
26 mai 2019
3557 > irishupk
Messages postés
19
Date d'inscription
vendredi 13 avril 2018
Statut
Membre
Dernière intervention
22 mai 2019
-
Merci.
Messages postés
17705
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
25 mai 2019
4321
0
Merci
hello
Sinon si il n'a pas retrouver le nom dans BD.csv, il doit rechercher le nom de la colonne 11 dans dans BD.csv. Si la colonne 11 possède un nom, il faut rechercher ce nom dans BD.csv. Si il y a une correspondance, il doit afficher les colonne 8 et 9 de la ligne où il y a eu correspondance de BD.csv.

j'ai beau secouer, ce n'est pas clair ...