[Shell] Script

Résolu
Bonjour,

Cela fait une dizaine que je n'ai pas mis les mains dans le camboui...

J'ai un script à corriger car il ne fonctionne pas :-s

Ce script doit recherche un n° de tél dans un fichier csv (;) à partir d'une liste de n° contenu dans un fichier input.

Le script est le suivant :
#!/bin/bash
#set -x

clear
echo "--------------------------------"
echo "Verification des retours DRACCO "
echo "--------------------------------"

dddd="ZZ"

echo "" > output

cat input | while read nd
do
 	dddd=`grep $nd /data/hvme/infiles/dracco/archive/*.dat | cut -c69-70 | grep "00"`
	echo " retour : $nd " $dddd
	if [ "$dddd" == "00" ]
	then
		echo $nd $dddd 	
		echo "update mmc_lignes set l_conf_dracco='00' where l_ligne='"$nd"' and l_acti='1';" >> output	
		dddd=""
	else
		dddd=""
	fi	
done
A votre avis où sont les erreurs ?

J'ai essayé
dddd=`grep ${nd} /data/hvme/infiles/dracco/archive/*.dat | cut -c69-70 | grep "00"`
mais l'ajout d'{} n'a rien changé...

A+DDD
Configuration: Windows XP
Firefox 2.0.0.3

4 réponses

  1. Modérateur
    Salut,

    On pourrait avoir un aperçu d'un des fichiers "*.dat" ainsi qu'un aperçu du fichier "input" et si c'est pas trop demandé, un aperçu de ce que donne la commande :
    grep $nd /data/hvme/infiles/dracco/archive/*.dat | cut -c69-70 | grep "00"
    en masquant ou changeant les noms, numéros de tél ou références génantes. Merci.

    ;-))
    1. un grep 206765197 ... fonctionne normalement.

      ...comme demandé...
      input :
      206765197
      100029270
      110175947
      110723370
      110894481
      110910729
      111024562

      fichier.dat
      1A;31D0;0206765197;O;20010101;000000;00;Demande traitee correctement;20010101;15G714
      1A;31D2;0110723370;O;20010101;000000;00;Demande traitee correctement;20010101;15D716
      
      voili voilou

      Merci de votre intérêt ;)
      1. Modérateur
        un grep 206765197 ... fonctionne normalement.
        Oui ça je me doute, mais est-ce que le reste de la commande, à savoir "| cut -c71-72 | grep "00"" donne le résultat escompté ?
        Et quel est-il d'ailleurs ce résultat escompté ?

        Parce que chez moi avec ton fichier ".dat" ça donne rien, vu que les caractères "69-70" sont ";2" et ne correspondent en rien à "00" !!!

        Alors qu'en remplaçant "69-70" par "71-72" ça marche ;-))
      2. ok d'ac ...
        Mais j'ai une question sur le script suivant et son résultat :
        cat input | while read nd
        do
         	echo "Input:${nd}."
        done
        donne
        .nput:206765197
        .nput:100029270
        Pourquoi le point terminal passe en début de ligne ?
        Est-ce que la variable $nd contient un caractère de "retour à la ligne" ?
        A+DDD
    2. Modérateur
      Re-

      Pourquoi le point terminal passe en premier caractère ?
      Tu dois avoir un problème avec ton shell, parce que déjà en plus du point, ton "I" de "Input" est sucré au passage !!
      Par contre chez moi le script fonctionne bien.

      Est-ce que la variable $nd contient un caractère de "retour à la ligne" ?
      Non, le retour à la ligne résulte du parsage du fichier dans la boucle "while" qui traite une ligne à la fois.
      Si tu tiens vraiment à éliminer ce retour à la ligne utilises plutôt la commande externe "echo" et son paramètre "-e" :
      echo -e "Input:${nd} \c"
      Tu peux aussi écrire ton script de cette façon :
      #!/bin/bash
      
      while read nd
      do
              echo -e "Input:${nd} \c"
      done < input
      Au fait quand est-il de ton script précédent, il marche ou pas ? As-tu fais des modifications par rapport aux réponses reçues ?

      :-)
      1. Merci pour l'explication.
        Le script précedent ne fonctionne toujours pas : je dois avoir un pb avec mon shell et je n'en suis pas l'administrateur :-S

        le script
        cat input | while read nd
        do
          grep $nd *.dat
        done
        ne sort rien !
      2. Modérateur
        Chez moi ça marche, bizarre ;-\
        Essaie avec ça :
        #!/bin/bash
        
        while read nd
        do
         #      echo -e "Input:${nd} \c"
         grep "$nd" *.dat
        done < input
        et lance ton script avec les options de débogages, à savoir "-xv" :
        sh -xv ton_script
        ;-))
      3. Yop,

        J'ai pas trop le temps de chercher donc nous avons choisi de modifier le fichier input en incluant un caractère blanc après chaque numéro de téléphone. Apparemment, j'ai un carriage return en fin de chaine qui gène son utilisation !
        J'ai également adapté mon script car les enreg des fichiers dat (csv) ne sont pas de longueur fixe donc un cut -d";" -f7 me ramève le septième champs des lignes des fichiers csv ramenées par le grep.
        En conclusion, j'ai repris un script foireux et comme d'hab j'ai fait confiance à son auteur : grave erreur... Moralité ( éternelle et répétitive ) , j'efface tout et je recommence !

        Merci de votre patience !!!!!!