[BASH] soucis de variable

Résolu
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. Modérateur
    [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. Modérateur
      #! /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. 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 ! >.<
        1. Modérateur
          #! /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
          
          1. 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
            1. 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 :$ ...
              1. Modérateur
                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
                1. 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.
                  1. 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 ;).
                    1. 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 !!!!
                      1. 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.
                        1. Modérateur
                          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.
                          1. 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.