Bash
方便地解析帶有單位後綴的數字嗎?
假設您有具有人類可讀格式的數量的數據,例如 的輸出
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; }
這是一個簡單的腳本。您可以將其視為起點。希望它會有所幫助!