Bash ne lit pas toutes les lignes
Résolu
irishupk
Messages postés
27
Statut
Membre
-
dubcek Messages postés 19021 Statut Contributeur -
dubcek Messages postés 19021 Statut Contributeur -
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
j'ai également essayé avec while et for line in $(<$fichier) mais même problème
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
A voir également:
- Bash ne lit pas toutes les lignes
- Comment savoir si quelqu'un lit mes messages sur whatsapp - Accueil - Messagerie instantanée
- Mon pc ne lit pas ma clé usb - Guide
- Filtre excel ne fonctionne pas sur toutes les lignes ✓ - Forum Excel
- Prise en compte partielle des données par la fonction filtre ✓ - Forum Excel
- Afficher toutes les lignes masquées excel ✓ - Forum Excel
2 réponses
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
De même une boucle
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… readserait plus adaptée ici (sous réserve d'en savoir un peu plus)
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 ...
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 ...
En faite, je possède deux fichiers :
christyi.csv
et
BD.csv qui me sert de base de données (ici une infime partie)
Pour chaque ligne de christyi.csv, le but est de rechercher le contenu de la colonne 10 dans BD.csv. Deux cas de figure :
- Si la colonne 10 possède un nom : il faut rechercher ce nom dans BD.csv. Si il y a une correspondance, il doit afficher il doit afficher les colonne 8 et 9 de la ligne où il y a eu correspondance de BD.csv. 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. Sinon si il n'a pas retrouver le nom dans BD.csv, il doit rechercher le nom de la colonne 12 dans dans BD.csv. Si la colonne 12 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. Sinon si il n'a pas retrouver le nom dans BD.csv, il doit mettre NA;NA.
- Si la colonne possède NA : 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. Sinon si il n'a pas retrouver le nom dans BD.csv, il doit rechercher le nom de la colonne 12 dans dans BD.csv. Si la colonne 12 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. Sinon si il n'a pas retrouver le nom dans BD.csv, il doit mettre NA;NA.
Désoler pour ce gros pavé
Attend le passage d'un spécialiste "awk" comme "dubcek"…
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 ! :)