Gå til innhold

Trenger hjelp med skallprogram


Anbefalte innlegg

Sliter litt med et skallprogram. Programmet

skal analysere loggfiler, noe det gjør. Problemet er at hendelsene skrives ut flere ganger.

Utskriften blir:

a 3

b 2

b 9

a 33

c 1

utskriften skal bli:

a 36

b 11

c 1

 #!/bin/bash
fil=logg.txt
declare -i antall=1
declare -i prosent
declare -i sluttSum
function stjerner(){
stjerner=""
for((i=0;i<$1;i+=6))
do
 stjerner=$stjerner"*"
done
echo "$stjerner"
}
function metode1(){
declare -i sum
kall=$1
exec 3<&0
exec 0<$fil
while read line
do
 kallet=`echo $line| cut -d" " -f1`
 if [ "$kall" = "$kallet" ]; then
  sum+=`echo $line| cut -d" " -f2`
 fi
done
exec 0<&3
echo $kall $sum
}
function metode2(){
exec 3<&0
exec 0<$fil
while read line
do
 metode1 $line
done
exec 0<&3
}
function metode3(){
metode2>resultat.txt
uniq resultat.txt > resultat.new
declare -i totalSum
declare -i sum2
declare -i prosent
exec 3<&0
exec 0<resultat.new
while read line
do
 totalSum+=`echo $line| cut -d" " -f2`
done
exec 0<&3
exec 3<&0
exec 0<resultat.new
while read line
do
 sum2=`echo $line| cut -d" " -f2`
 prosent=$(((($sum2 * 100)) /  $totalSum))
 echo -n  $line "  " $prosent " "  && stjerner $prosent
done
exec 0<&3

}
metode3

 

Håper noen kan hjelpe!

Endret av dataguten
Lenke til kommentar
Videoannonse
Annonse

Hei,

 

Kan du legge ved noe eksempeldata samt forklare hva du prøver å oppnå ?

 

Vil bare si at den koden såg veldigt uryddig/overkomplisert hvis du bare skal telle antall ganger hendelsene skjer.

Endret av grapz
Lenke til kommentar

Hei,

 

Kan du legge ved noe eksempeldata samt forklare hva du prøver å oppnå ?

 

Vil bare si at den koden såg veldigt uryddig/overkomplisert hvis du bare skal telle antall ganger hendelsene skjer.

Takker for svar.

 

Programmet skal analysere loggfilen: logg.txt, noe det gjør. Problemet er at hendelsene skrives ut flere ganger.

Utskriften blir:

a 3

b 2

b 9

a 33

c 1

utskriften skal bli:

a 36

b 11

c 1

Lenke til kommentar

Hei,

 

Så vidt jeg ser så bruker du 'uniq resultat.txt > resultat.new' for å filtrere de unike linjene.

Uniq sammenligner hele linjen for å se om den er unik eller ikke.

 

Har laget en stygg liten fiks.

 

Rett før linjen 'exec 0<resultat.new' i metode3() sett inn:

awk -F" " '{a[$1]+=$NF}END{for(i in a) print i,a}' resultat.new > resultat.new2

 

Bytt ut 'resultat.new' med 'resultat.new2' i linja 'exec 0<resultat.new' i metode3().

 

Det virker iallefall i min testcase, men jeg vet ikke hvordan input filene dine ser ut, så kan vær den kødder.

 

Nedenfor er full kode med fiksen:

#!/bin/bash
fil=logg.txt
declare -i antall=1
declare -i prosent
declare -i sluttSum
function stjerner(){
 stjerner=""
 for((i=0;i<$1;i+=6))
 do
 stjerner=$stjerner"*"
 done
 echo "$stjerner"
}
function metode1(){
 declare -i sum
 kall=$1
 exec 3<&0
 exec 0<$fil
 while read line
 do
   kallet=`echo $line| cut -d" " -f1`
   if [ "$kall" = "$kallet" ]; then
  sum+=`echo $line| cut -d" " -f2`
   fi
 done
 exec 0<&3
 echo $kall $sum
}
function metode2(){
 exec 3<&0
 exec 0<$fil
 while read line
 do
   metode1 $line
 done
 exec 0<&3
}
function metode3(){
 metode2>resultat.txt
 uniq resultat.txt > resultat.new
 declare -i totalSum
 declare -i sum2
 declare -i prosent
 exec 3<&0
 exec 0<resultat.new
 while read line
 do
   totalSum+=`echo $line| cut -d" " -f2`
 done
 exec 0<&3
 exec 3<&0
 awk -F" " '{a[$1]+=$NF}END{for(i in a) print i,a[i]}' resultat.new > resultat.new2
 exec 0<resultat.new2
 while read line
 do
   sum2=`echo $line| cut -d" " -f2`
   prosent=$(((($sum2 * 100)) /  $totalSum))
   echo -n  $line "  " $prosent " "  && stjerner $prosent
 done
 exec 0<&3
}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...