dataguten Skrevet 22. november 2012 Del Skrevet 22. november 2012 (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 22. november 2012 av dataguten Lenke til kommentar
grapz Skrevet 22. november 2012 Del Skrevet 22. november 2012 (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 22. november 2012 av grapz Lenke til kommentar
dataguten Skrevet 22. november 2012 Forfatter Del Skrevet 22. november 2012 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
grapz Skrevet 22. november 2012 Del Skrevet 22. november 2012 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
dataguten Skrevet 22. november 2012 Forfatter Del Skrevet 22. november 2012 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. Lenke til kommentar
grapz Skrevet 22. november 2012 Del Skrevet 22. november 2012 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 Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå