mshafey
mshafey

Reputation: 89

Using awk to find numbers in KB then change and replace to GB and display the whole line

Trying to search/below numbers in below in KB unit (Cover KB: 7606353,) so it will be displayed as (Cover GB: 7.25,) I have tried many awk options to change below numbers from KB unit to GB and other complicated tools that I use to send outputs to files then to use again, my target is to have like a single awk so it find the number after (Cover KB: ) and divide it by /1024/1024 and change KB to GB .. the maximum effort i reached was

awk '($NF == ($NF+0)){printf("%s %6.2f\n",$0,$10/1024/1024)}END{print ""}' 

but that will display the number i need at the end of the line while i needed to replace it..Tried -F to cut some columns and didn't get the needed output as well.

Source:

XX YY ZZ checknpr  Y  checkagain  DEV  Cover KB: 7606353, TARGET GB: 1048576
XX YY ZZ checknpr  Y  checkagain  DEV  Cover KB: 7268433, TARGET GB: 1048576
XX YY ZZ checknpr  Y  checkagain  DEV  Cover KB: 6895144, TARGET GB: 1048576
XX YY ZZ checknpr  Y  checkagain  DEV  Cover KB: 6506311, TARGET GB: 1048576
XX YY ZZ checknpr  Y  checkagain  DEV  Cover KB: 5590773, TARGET GB: 1048576
XX YY ZZ checknpr  Y  checkagain  DEV  Cover KB: 5192929, TARGET GB: 1048576
XX YY ZZ checknpr  Y  checkagain  DEV  Cover KB: 4645949, TARGET GB: 1048576

Change to:

XX YY ZZ checknpr  Y  checkagain  DEV  Cover GB: 7.25, TARGET GB: 1048576   
XX YY ZZ checknpr  Y  checkagain  DEV  Cover GB: 6.93, TARGET GB: 1048576   
XX YY ZZ checknpr  Y  checkagain  DEV  Cover GB: 6.58, TARGET GB: 1048576   
XX YY ZZ checknpr  Y  checkagain  DEV  Cover GB: 6.20, TARGET GB: 1048576   
XX YY ZZ checknpr  Y  checkagain  DEV  Cover GB: 5.33, TARGET GB: 1048576   
XX YY ZZ checknpr  Y  checkagain  DEV  Cover GB: 4.95, TARGET GB: 1048576   
XX YY ZZ checknpr  Y  checkagain  DEV  Cover GB: 4.43, TARGET GB: 1048576

Upvotes: 2

Views: 46

Answers (2)

Andre Wildberg
Andre Wildberg

Reputation: 19088

This awk works without knowing the field number of the condition

$ awk '{ for(i=1;i<=NF;i++){ if($i~/^KB:/){ $i="GB:";
    $(i+1)=sprintf("%.2f,",$(i+1)/1024^2) } } }1' file
XX YY ZZ checknpr Y checkagain DEV Cover GB: 7.25, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 6.93, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 6.58, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 6.20, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 5.33, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 4.95, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 4.43, TARGET GB: 1048576

Upvotes: 2

Cyrus
Cyrus

Reputation: 88654

I suggest:

awk '{$9=$12; $10=sprintf("%.2f,", $10/$13)} {print}' file

Output:

XX YY ZZ checknpr Y checkagain DEV Cover GB: 7.25, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 6.93, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 6.58, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 6.20, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 5.33, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 4.95, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 4.43, TARGET GB: 1048576

Upvotes: 2

Related Questions