[BASH] soucis de variable

Résolu/Fermé
Iroboot - 21 avril 2009 à 14:48
 Iroboot - 23 avril 2009 à 17:21
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

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
22 avril 2009 à 14:21
[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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
23 avril 2009 à 15:08
#! /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 ! >.<
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
22 avril 2009 à 13:43
#! /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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
22 avril 2009 à 17:22
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
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
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
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
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
23 avril 2009 à 16:44
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
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