/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
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;
}



Søg
Reklame
Statistik
Spørgsmål : 177438
Tips : 31962
Nyheder : 719565
Indlæg : 6408047
Brugere : 218879

Månedens bedste
Årets bedste
Sidste års bedste