Bash

方便地解析帶有單位後綴的數字嗎?

  • June 12, 2017

假設您有具有人類可讀格式的數量的數據,例如 的輸出du -h,並且想要進一步對這些數字進行操作。假設您想通過 grep 對數據進行管道傳輸,以對該數據的子集進行求和。您可以在許多您以前從未見過的系統上臨時執行此操作,並且只有很少的實用程序。您需要所有標準 10^n 後綴的後綴轉換。

是否存在一個 gnu-linux 實用程序來將後綴數字轉換為管道中的實數?您是否編寫了一個 bash 函式來執行此操作,或者一些可能很容易記住的 perl,而不是一段正則表達式替換或幾個 sed 步驟?

38M     /var/crazyface/courses/200909-90147
2.7M    /var/crazyface/courses/200909-90157
1.1M    /var/crazyface/courses/200909-90159
385M    /var/crazyface/courses/200909-90161
1.3M    /var/crazyface/courses/200909-90169
376M    /var/crazyface/courses/200907-90171
8.0K    /var/crazyface/courses/200907-90173
668K    /var/crazyface/courses/200907-90175
564M    /var/crazyface/courses/200907-90178
4.0K    /var/crazyface/courses/200907-90179

| grep 200907 | <amazing suffix conversion> | awk '{s+=$1} END {print s}'


相關參考:

根據我對您連結到的問題之一的回答:

awk '{
   ex = index("KMGTPEZY", substr($1, length($1)))
   val = substr($1, 0, length($1) - 1)

   prod = val * 10^(ex * 3)

   sum += prod
}
END {print sum}'

使用的另一種方法:

sed 's/G/ * 1000 M/;s/M/ * 1000 K/;s/K/ * 1000/; s/$/ +\\/; $a0' | bc

您可以使用 perl 正則表達式來執行此操作。例如,

$value = 0;
if($line =~ /(\d+\.?\d*)(\D+)\s+/) {
  $amplifier = 1024 if ($2 eq 'K');
  $amplifier = 1024 * 1024 if ($2 eq 'M');
  $amplifier = 1024 * 1024 * 1024 if ($2 eq 'G');
  $value = $1 * $amplifier;
}

這是一個簡單的腳本。您可以將其視為起點。希望它會有所幫助!

引用自:https://serverfault.com/questions/237412