[Shell] Script

Résolu
davidubois Messages postés 7 Statut Membre -  
davidubois Messages postés 7 Statut Membre -
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. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    affiche une ligne de ton fichier .dat

    0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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.

    ;-))
    0
  3. davidubois Messages postés 7 Statut Membre 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 ;)
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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 ;-))
      0
    2. davidubois Messages postés 7 Statut Membre 1
       
      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
      0
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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 ?

    :-)
    0
    1. davidubois Messages postés 7 Statut Membre 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 !
      0
    2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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
      ;-))
      0
    3. davidubois Messages postés 7 Statut Membre 1
       
      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 !!!!!!
      0