|
| awk one-liner søges Fra : Leif Neland |
Dato : 16-10-09 10:47 |
|
En one-liner søges til at lægge disse værdier fra en logfil sammen, hvor $3
har disse værdier:
(3,33M,
(8k,
(21k,
(796,
Der er kun mulighederne <ingenting> k og M som postfix.
Leif
| |
Sv-e (16-10-2009)
| Kommentar Fra : Sv-e |
Dato : 16-10-09 20:16 |
|
Leif Neland skrev:
> En one-liner søges til at lægge disse værdier fra en logfil sammen, hvor $3
> har disse værdier:
>
> (3,33M,
> (8k,
> (21k,
> (796,
>
> Der er kun mulighederne <ingenting> k og M som postfix.
>
> Leif
>
>
Hej Leif
Behøver det at være AWK ?
Hvis ikke kan du lave et lille shellscript med "cut sed og expr" som kan
give det ønskede resultat. Dog med forbehold for du selv erstatter
"log.txt" med den reele logfil og at data er præcis som ovenstående,
hvis ikke må du selv skrue lidt på sed's argumenter:
<SCRIPT START>
#!/bin/sh
for i in `cut -f3 -d' ' log.txt|sed -e s/[a-z,A-Z,\(]//g`
do
sum=`expr $sum + $i`
done
echo $sum
</SCRIPT SLUT>
| |
Sv-e (16-10-2009)
| Kommentar Fra : Sv-e |
Dato : 16-10-09 20:24 |
|
Sv-e skrev:
> Leif Neland skrev:
>> En one-liner søges til at lægge disse værdier fra en logfil sammen,
>> hvor $3 har disse værdier:
>>
>> (3,33M,
>> (8k,
>> (21k,
>> (796,
>>
>> Der er kun mulighederne <ingenting> k og M som postfix.
>>
>> Leif
>>
>>
> Hej Leif
>
> Behøver det at være AWK ?
>
> Hvis ikke kan du lave et lille shellscript med "cut sed og expr" som kan
> give det ønskede resultat. Dog med forbehold for du selv erstatter
> "log.txt" med den reele logfil og at data er præcis som ovenstående,
> hvis ikke må du selv skrue lidt på sed's argumenter:
>
> <SCRIPT START>
>
> #!/bin/sh
> for i in `cut -f3 -d' ' log.txt|sed -e s/[a-z,A-Z,\(]//g`
> do
> sum=`expr $sum + $i`
> done
> echo $sum
>
> </SCRIPT SLUT>
Ok det var da en bøf af rang, scriptet tager ikke højde for komme tallet :(
| |
Frank Damgaard (16-10-2009)
| Kommentar Fra : Frank Damgaard |
Dato : 16-10-09 21:27 |
|
Leif Neland wrote:
> En one-liner søges til at lægge disse værdier fra en logfil sammen, hvor $3
> har disse værdier:
>
> (3,33M,
> (8k,
> (21k,
> (796,
>
> Der er kun mulighederne <ingenting> k og M som postfix.
>
Dit problem er vel at du skal have fjernet ( foran, og kommaet bagefter
samt du vil vel have M ,og k lavet om tilpassende antal x1024 ?
har du prøvet "man gawk" der er alle funktioner beskrevet.
lidt brug af reg-exp , sub() , strtonum() burde klare det.
oneliner bliver det dog ikke, så må du lave logfil om.
BEGIN {
OFMT="%.10g" ;
sum=0;
}
# kun linier der matcher i $3 : (sanity check)
$3 ~ /^\([[:digit:]]+(|,[[:digit:]]+)[Mk]?,$/ {
a3=$3;
n=sub(/,$/,"",a3); # fjern slut ,
n=sub(/^\(/,"",a3); # fjern (
n=sub(/,/,".",a3); # fjern forbandet dansk komma, erstat med .
prod= index(a3,"k")>0 ? 1024 : 1 ;
prod= index(a3,"M")>0 ? 1048576 : prod ;
tal=strtonum(a3)*prod;
sum += tal;
print "[",a3,"]=>",tal,sum;
}
END {
print "sum=",sum;
}
| |
|
|