2016-09-27 5 views
-1

habe ich ein Skript, dass, wenn ich endlich RohrVerwendung ersetzen awk Zeichenfolge durch Multiplikation

awk -F'[()]' '{ 
printf("%s %s\n", $2, $4) 
}' 

kehrt

251.393GB 103.005GB 
245.296GB 101.992GB 
250.526GB 103.639GB 
259.158GB 112.549GB 
245.266GB 102.415GB 
325.020GB 129.041GB 
245.135GB 102.086GB 
250.583GB 103.758GB 
244.247GB 103.268GB 
251.256GB 104.008GB 
244.496GB 102.643GB 
265.133GB 113.523GB 
250.332GB 103.556GB 
319.579GB 127.401GB 
250.140GB 103.722GB 
244.765GB 102.541GB 

Allerdings würde ich GB konvertieren möchte (was ich fungiert als 1024 gefunden haben^3) bis MB (was ich als 1000^2 ausdrücken möchte).

Wie kann ich mithilfe von awk das Gerät (GB, MB usw.) erkennen und es in die entsprechende Einheit mit 1000 statt 1024 konvertieren? Im Grunde möchte ich einfach zu behandeln GB als *(1024*1024*1024)/(1000*1000)

+1

Wenn Sie ein Skript wollen MB erkennen, Warum würden Sie keine MBs in Ihre Beispieleingabe aufnehmen? Enthalten Sie auch die erwartete Ausgabe, die Ihrer Posted-Input-Eingabe entspricht (die auf nur ein paar Zeilen reduziert werden sollte). –

Antwort

0

erste, vorauszuberechnen den Multiplikator:

awk 'BEGIN{print (1024*1024*1024)/(1000*1000)}' 
1073.74 

dann finden Felder mit „GB“, multiplizieren sie, und fügen Sie „MB“.

awk '{ 
    if($1~"GB") $1=1073.74*$1"MB" 
    if($2~"GB") $2=1073.74*$2"MB" 
    print $1, $2 
}' 

(beide GNU awk und awk Griff Mathematik auf Strings, indem nur die Anzahl Zeichen unter Berücksichtigung zB "123.45GB" * 10 Ausbeuten 1234.5)

+1

guter Punkt! Fest. – webb

0

Wie wäre es

echo "319.579GB 127.401GB" \ 
| awk '{sub(/GB$/,"",$1);sub(/GB$/,"",$2);printf("%.3f\t%.3f\n", $1*(1024*1024*1024)/(1000*1000) , $2*(1024*1024*1024)/(1000*1000))}' 

Ausgang

43145.338  136795.782 

Das gleiche gilt für eine Datei

awk '{sub(/GB$/,"",$1);sub(/GB$/,"",$2) 
    printf("%.3f\t%.3f\n", $1*(1024*1024*1024)/(1000*1000) , $2*(1024*1024*1024)/(1000*1000))}' file 

Sie können die Dezimalgenauigkeit anpassen, aber die .3 Wert zu ändern, oder es altogehter weglassen, wenn Sie nur einen ganzzahligen Wert wollen.

sub(...) Arbeiten von GB am Ende der Leitung $ und ersetzt mit dem leeren String ("") für die genannte Spalte (d.h. $1 oder $2) entsprechen. sub akzeptiert jeden String-Wert im 3. Feld, also "strGB", arr[1], arr [key] `und andere werden auch funktionieren.

IHTH

+0

Dieser Ausgang fehlt 300000 MB. –

+0

OP möchte auch Einheiten erkennen; Diese Antwort geht davon aus, dass es immer GB ist. – webb

+0

Ich nehme an, das OP ist ein großer Junge und kann aus dieser Lösung extrapolieren, was man für MB, PB, KB, etc. ;-) Viel Glück für jeden. – shellter

0

Lösung perl mit denen die e Flagge in solchen Fällen praktisch ist

$ cat ip.txt 
251.393GB 103.005GB 
245.296GB 101.992GB 
250.526GB 103.639GB 

Ohne Dezimalgenauigkeit Begrenzungs

$ perl -pe 's|([0-9.]+)GB|$1*(1024*1024*1024)/(1000*1000)|ge' ip.txt 
269931.178360832 110600.77658112 
263384.574459904 109513.076113408 
269000.244199424 111281.528897536 

Mit Präzision

$ perl -pe 's|([0-9.]+)GB|sprintf "%.3f",$1*(1024*1024*1024)/(1000*1000)|ge' ip.txt 
269931.178 110600.777 
263384.574 109513.076 
269000.244 111281.529 

Pre-Berechnungsfaktor

$ perl -pe 'BEGIN{$m=(1024*1024*1024)/(1000*1000)} s|([0-9.]+)GB|sprintf "%.3f",$1*$m|ge' ip.txt 
269931.178 110600.777 
263384.574 109513.076 
269000.244 111281.529 

Um auch MB in Ausgabe zu drucken, verwenden Sie %.3fMB

2
$ cat file 
251.393GB 103.005GB 
245.296GB 101.992GB 
250.526GB 103.639GB 

$ awk '{for (i=1;i<=NF;i++) printf "%sMB%s", $i * ($i~/GB/ ? 1073.4 : 1), (i<NF ? OFS : ORS)}' file 
269845MB 110566MB 
263301MB 109478MB 
268915MB 111246MB 

oder wenn Sie es vorziehen:

$ awk '{for (i=1;i<=NF;i++) printf "%.3fMB%s", $i * ($i~/GB/ ? 1073.4 : 1), (i<NF ? OFS : ORS)}' file 
269845.246MB 110565.567MB 
263300.726MB 109478.213MB 
268914.608MB 111246.103MB 
Verwandte Themen