簡體   English   中英

通過乘法使用awk替換字符串

[英]Use awk replace string by multiplication

我有一個腳本,當我最終通過管道

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

退貨

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

但是,我想將GB (我發現它充當1024 ^ 3)轉換為MB (我想表達為1000 ^ 2)。

使用awk ,如何檢測單位( GBMB等),並使用1000(而不是1024)將其轉換為適當的相關單位? 本質上我只想將GB視為*(1024*1024*1024)/(1000*1000)

$ 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

或者,如果您喜歡:

$ 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

使用perl解決方案,在這種情況下e標志很方便

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

不限制十進制精度

$ 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

精度高

$ 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

預先計算因子

$ 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

要同時在輸出中打印MB ,請使用%.3fMB

首先,預先計算乘數:

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

然后找到帶有“ GB”的字段,將它們相乘,然后附加“ MB”。

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

(GNU awkawk都只考慮數字字符來處理字符串上的數學運算,例如"123.45GB" * 10產生1234.5

怎么樣

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))}'

輸出

43145.338      136795.782

文件相同

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

您可以調整小數精度,但可以更改.3值;如果只需要整數值,則可以將其保留下來。

sub(...)通過匹配$末尾的GB工作,並用空字符串( "" )替換命名列(即$1$2 )。 sub將在第三個字段中接受任何字符串值,因此“ strGB”, arr[1] ,arr [key]`和其他名稱也將起作用。

高溫超導

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM