Gå til innhold

Trenger hjelp med skallprogram


Anbefalte innlegg

Skrevet (endret)

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
Videoannonse
Annonse
Skrevet (endret)

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
Skrevet

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

Skrevet

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
}

Skrevet

Tusen takk for hjelpen.

Eneste problemet no er at jeg ikke får utskriften formatert. Vil ha tabulator ("\t") etter hver verdi, slik at det blir oversiktlig.

Skrevet

Bytt ut innholdet i den siste 'while read line do' blokken i metode3 med:

 

text=$(echo $line | cut -d" " -f1)
sum2=`echo $line| cut -d" " -f2`
prosent=$(((($sum2 * 100)) /  $totalSum))
echo -ne "$text\t$sum2\t$prosent\t" && stjerner $prosent

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...