[BASH] soucis de variable

Résolu
Iroboot -  
 Iroboot -
Bonjour,
c'est encore moi ! Mais je touche au but ! (rageant de voir qu'on est pas si loin arg ! :D)

voila aujourd'hui j'ai quelques petits soucis avec un script en bash toujours :

je me retrouve avec deux fichiers :

list.db :

toto 12
tata 14
titi 16
tutu 12
tete 12
bobo 14
baba 18
bibi 14
bubu 12

error.db :

tata 14
bubu 12

le but de mon script est de lire chaque ligne de error.db et en prenant le numéro (deuxieme colonne), de comparer avec list.db puis relever chaque ligne dans list.db pour les placer dans un nouveau fichier rapportnum.txt
Une fois cela fait, il compte le nomre de fois qu'apparait le numéro dans le nouveau fichier et le note sur la ligne.
Après, une fois tout cela fait, il range les numéro du plus important au moins important (du nombre de fois ou il apparait le plus grand au moins grand).

cela parait un peu brouillon mais je vais vous montrer mon script :

#!/bin/bash

set -x

#lecture ligne par ligne

oldIFS=$IFS # sauvegarde du separateur de champ
IFS=$'\n' # nouveau separateur de champ, le caractere fin de ligne
for ligne in $(cat error.db)
do

./linecomand $line
var="$(grep -c $? list.db )";sed -n "/$2/ {s/.*/& $var/p}" error.db >> rapportnum.txt

done
IFS=$old_IFS # retablissement du separateur de champ par déefaut


sort -n -r -k 3 rapportnum.txt >> rapportranger.txt

(merci à Jipicy pour son script de lecture ligne par ligne :D)

avec un petit script linecomand qui permet de relever le numéro de la deuxième colonne dans error.db

#!/bin/bash

cat $2


je devrais avoir normalement :

rapportnum.txt :

tata 14 3
bobo 14 3
bibi 14 3
toto 12 4
tutu 12 4
tete 12 4
bubu 12 4

rapportranger.txt :

toto 12 4
tutu 12 4
tete 12 4
bubu 12 4
tata 14 3
bobo 14 3
bibi 14 3

voila, le soucis étant qu'à priori ca coince eu niveau de :

./linecomand $line
var="$(grep -c $? list.db )"

car il n'arrive pas a relevé le numéro :'( ...

si quelqu'un pouvait m'aider se serait super, merci d'avance et merci à tous pour m'avoir aider à arriver jusque la :D j'y connaissait rien en bash et maintenant je me sens moins démunis face à ce langage.

13 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    [tmpfs]$ cat list.db
    toto 12
    tata 14
    titi 16
    tutu 12
    tete 12
    bobo 14
    baba 18
    bibi 14
    bubu 12
    
    [tmpfs]$ cat error.db
    tata 14
    bubu 12
    
    [tmpfs]$ cat foo.sh
    #! /bin/sh
    
    #set -xv
    
    while read line
    do
    num="$(grep -c ${line//[^0-9]/} < list.db)"
    sed  -n "\#${line//[^0-9]/}# {s/.*/& = ${num}/p}" list.db >> rapportfinal
    done < error.db
    
    sort -n -r -k 4 rapportfinal > rapportrange
    
    [tmpfs]$ ./foo.sh
    
    [tmpfs]$ cat rapportfinal
    tata 14 = 3
    bobo 14 = 3
    bibi 14 = 3
    toto 12 = 4
    tutu 12 = 4
    tete 12 = 4
    bubu 12 = 4
    
    [tmpfs]$ cat rapportrange
    tutu 12 = 4
    toto 12 = 4
    tete 12 = 4
    bubu 12 = 4
    tata 14 = 3
    bobo 14 = 3
    bibi 14 = 3
    
    [tmpfs]$
    1
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    #! /bin/bash
    
    set -xv
    
    while read line
    do
    num="$ (grep -c ${line//[^0-9]/} < list.db)" 
    var="$(grep -o '[0-9][0-9]*' <<<${line})"
    sed -n "/${var}/ {s/.*/& = ${num}/p}" list.db >> rapportfinal
    done < error.db
    
    sort -n -r -k 3 rapportfinal > rapportrange 
    La ligne en gras, il y a un espace entre "$" et "(" et il n'en faut pas !!!

    Recopies-le (enfin copie/colle) comme ça :
    #! /bin/bash
    
    set -xv
    
    while read line
    do
    num="$(grep -c ${line//[^0-9]/} < list.db)"
    var="$(grep -o '[0-9][0-9]*' <<<${line})"
    sed -n "/${var}/ {s/.*/& = ${num}/p}" list.db >> rapportfinal
    done < error.db
    
    sort -n -r -k 3 rapportfinal > rapportrange 
    1
  3. Iroboot
     
    petit up ?

    Arf ... :/ J'suis quasi sur en plus que c'est un petit truc de rien du tout mais je coince c'est horrible ! >.<
    0
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    #! /bin/sh
    
    #set -xv
    
    while read line
    do
    num="$(grep -c ${line//[^0-9]/} < list.db)"
    sed  -n "\#${line//[^0-9]/}# {s/.*/& = ${num}/p}" list.db >> rapportfinal
    done < error.db
    
    sort -n -r -k 4 rapportfinal > rapportrange
    
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Iroboot
     
    salut jipicy :D

    j'ai essayé ton script mais il ne semble pas vouloir marcher j'ai dut faire une erreur quelque part :$

    j'ai copier donc ce script :

    #! /bin/sh

    #set -xv

    while read line
    do
    num="$(grep -c ${line//[^0-9]/} < list.db)"
    sed -n "\#${line//[^0-9]/}# {s/.*/& = ${num}/p}" list.db >> rapportfinal.txt
    done < error.db

    sort -n -r -k 4 rapportfinal.txt > rapportrange.txt


    et il m'affiche a chaque lancement :

    ./monscript: 9: Bad substitution
    ./monscript: 9: Bad substitution
    0
  7. Iroboot
     
    GEANT CA MARCHE !!

    Tu es un dieu pour moi ! *.* !

    J'ai pas compris ce qui s'est passé : j'ai recopié ton script et ca marchait pas, j'ai modifié ca marchait toujours pas et quand je l'ai re-recopié ... Ca a marché ... Enfin l'essentiel est que ca marche parfaitement !

    Une simple question : je test en remplacant les nombres dans list.db et error.db par des numéros plus long et de type numéros de téléphones (10 chiffres significatifs et commençant par des zéros) à priori il faut faire quelques modifications ...

    j'ai fait ceci :

    #! /bin/sh

    set -xv

    while read line
    do
    num=" $(grep -c ${line//[0][1-6][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/} < error.db)"
    sed -n "\#${line//[0][1-6][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/}# {s/.*/& ${num}/p}" list.db >> rapportfinal
    done < error.db

    sort -n -r -k 3 rapportfinal > rapportrange


    le petit soucis est qu'à priori il ne semble plus vouloir compter ... ^^' il me releve une fois chaque ligne de error.db et puis c'est tout ... J'ai dut mal faire une commande :$ ...

    note : les fichiers sont de la forme :

    list.db :

    toto 0123456789
    tata 0555555555
    titi 0677775555
    tutu 0123456789
    tete 0123456789
    bobo 0555555555
    baba 0987654321
    bibi 0555555555
    bubu 0123456789

    error.db :

    toto 0123456789
    bobo 0555555555

    et il m'affiche :

    rapportfinal :

    toto 0123456789 1
    bobo 0555555555 1

    rapportrange :

    bobo 0555555555 1
    toto 0123456789 1

    P.S. : j'espere avoir prit le bon argument pour la commande sort et bien le tout dernier nombre et non une partie du numéro de tel :$ ...
    0
  8. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Non il ne faut rien changer au script, laisser le script tel que je l'ai écrit !
    [tmpfs]$ cat list.db
    toto 0123456789
    tata 0555555555
    titi 0677775555
    tutu 0123456789
    tete 0123456789
    bobo 0555555555
    baba 0987654321
    bibi 0555555555
    bubu 0123456789
    
    [tmpfs]$ cat error.db
    toto 0123456789
    bobo 0555555555
    
    [tmpfs]$ cat foo.sh
    #! /bin/sh
    
    #set -xv
    
    while read line
    do
    num="$(grep -c ${line//[^0-9]/} < list.db)"
    sed  -n "\#${line//[^0-9]/}# {s/.*/& = ${num}/p}" list.db >> rapportfinal
    done < error.db
    
    sort -n -r -k 4 rapportfinal > rapportrange
    
    [tmpfs]$ ./foo.sh
    
    [tmpfs]$ cat rapportfinal
    toto 0123456789 = 4
    tutu 0123456789 = 4
    tete 0123456789 = 4
    bubu 0123456789 = 4
    tata 0555555555 = 3
    bobo 0555555555 = 3
    bibi 0555555555 = 3
    
    [tmpfs]$ cat rapportrange
    tutu 0123456789 = 4
    toto 0123456789 = 4
    tete 0123456789 = 4
    bubu 0123456789 = 4
    tata 0555555555 = 3
    bobo 0555555555 = 3
    bibi 0555555555 = 3
    
    [tmpfs]$
    Édit : Si la partie avec "sed" pose problème, tu peux l'écrire autrement :
    #! /bin/sh
    
    #set -xv
    
    while read line
    do
    num="$(grep -c ${line//[^0-9]/} < list.db)"
    var="$(grep -o '[0-9][0-9]*' <<<${line})"
    sed  -n "/${var}/ {s/.*/& = ${num}/p}" list.db >> rapportfinal
    done < error.db
    
    sort -n -r -k 4 rapportfinal > rapportrange
    0
  9. Iroboot
     
    Bonjour !

    Merci beaucoup pour ton aide Jipicy ! Ca marche presque ! J'ai utilisé les deux versions de ce script en y apportant une légère modification car il ne veut pas marcher sinon, il s'agit du tout début ou je suis obligé de mettre #! /bin/bash au lieu de #! /bin/sh sinon il bloque, j'espère que ca ne modifie pas trop le script au niveau du codage :$ ...

    alors donc j'ai fait :

    #! /bin/bash

    set -xv

    while read line
    do
    num="$ (grep -c ${line//[^0-9]/} < list.db)"
    var="$(grep -o '[0-9][0-9]*' <<<${line})"
    sed -n "/${var}/ {s/.*/& = ${num}/p}" list.db >> rapportfinal
    done < error.db

    sort -n -r -k 3 rapportfinal > rapportrange

    ou bien :

    #! /bin/bash

    set -xv

    while read line
    do
    num="$ (grep -c ${line//[^0-9]/} < list.db)"
    sed -n "\#${line//[^0-9]/}# {s/.*/& ${num}/p}" list.db >> rapportfinal
    done < error.db

    sort -n -r -k 3 rapportfinal > rapportrange


    et il m'affiche toujours le même résultat :

    control@poc:~/check_modems$ ./test.sh

    while read line
    do
    num="$ (grep -c ${line//[^0-9]/} < list.db)"
    sed -n "\#${line//[^0-9]/}# {s/.*/& ${num}/p}" list.db >> rapportfinal
    done < error.db
    + read line
    + num='$ (grep -c 0123456789 < list.db)'
    + sed -n '\#0123456789# {s/.*/& $ (grep -c 0123456789 < list.db)/p}' list.db
    + read line
    + num='$ (grep -c 0555555555 < list.db)'
    + sed -n '\#0555555555# {s/.*/& $ (grep -c 0555555555 < list.db)/p}' list.db
    + read line

    sort -n -r -k 3 rapportfinal > rapportrange
    + sort -n -r -k 3 rapportfinal

    control@poc:~/check_modems$ cat rapportfinal
    toto 0123456789 $ (grep -c 0123456789 < routeurs_modem01.db)
    tutu 0123456789 $ (grep -c 0123456789 < routeurs_modem01.db)
    tete 0123456789 $ (grep -c 0123456789 < routeurs_modem01.db)
    bubu 0123456789 $ (grep -c 0123456789 < routeurs_modem01.db)
    tata 0555555555 $ (grep -c 0555555555 < routeurs_modem01.db)
    bobo 0555555555 $ (grep -c 0555555555 < routeurs_modem01.db)
    bibi 0555555555 $ (grep -c 0555555555 < routeurs_modem01.db)
    control@poc:~/check_modems$



    arf ! C'est vraiment a deux doigts de se finir XD.
    0
  10. Iroboot
     
    youps j'ai oublié mal reformulé XD

    control@poc:~/check_modems$ cat rapportfinal
    toto 0123456789 $ (grep -c 0123456789 < list.db)
    tutu 0123456789 $ (grep -c 0123456789 < list.db)
    tete 0123456789 $ (grep -c 0123456789 < list.db)
    bubu 0123456789 $ (grep -c 0123456789 < list.db)
    tata 0555555555 $ (grep -c 0555555555 < list.db)
    bobo 0555555555 $ (grep -c 0555555555 < list.db)
    bibi 0555555555 $ (grep -c 0555555555 < list.db)
    control@poc:~/check_modems$


    voila c'est mieux comme ca ;).
    0
  11. Iroboot
     
    En effet je viens de constater que mon copier coller a fonctionner de travers ... XD

    MERCIIIIIIIII CA MARCHE !!! J'suis trop content merci a toi Jipicy :D :D :D :D !!!!
    0
  12. Iroboot
     
    juste une dernier question, est ce que ca marche si on a des noms tel que

    list.db
    toto8 0123456789
    tata4 0555555555
    ti6ti 0677775555
    tu1tu 0123456789
    tet0e 0123456789
    bob1o 0555555555
    ba4ba 0987654321
    bib5i 0555555555
    bubu6 0123456789

    car j'ai l'impression qu'il prend tous les nombres qu'il y a sur la ligne.
    0
  13. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Ben non ça ne marche plus, mais faudrait arrêter de changer les données à tout bout de champs aussi.

    La syntaxe a été faite en fonction de ta demande première et sans tenir compte de tous les paramètres changeant... donc il te faut adapter en fonction de tes besoins et des cas susceptibles d'apparaitre un jour ou l'autre.
    0
  14. Iroboot
     
    ok merci désolé j'apprend a chaque fois de nouveaux trucs, je passe par palier si tu vois ce que je veux dire ;).

    Merci beaucoup pour l'aide apporter :D.
    0