Bash

刪除科學計數法 bash 腳本

  • December 9, 2013

當我將 MB 轉換為 GB 時,我得到低於輸出。我想要正常格式的輸出。當我使用bc我得到一個錯誤。文本文件包含近 100 行這樣的行。

我想在正常輸出中列印它,(不帶符號):

1.14441e-07
4.95911e-07
3.05176e-07
1.90735e-07
3.05176e-07

命令:

$ DIVISOR=104857600
$ sudo  du --max-depth=1 /home/xxx | tail -1 | \
     awk -v DIVISOR=104857600 '{print $1/DIVISOR}'
1.14441e-07

awk有一個 sprintf 函式,它使您可以訪問 printf “f” 格式說明符。

echo  .123456 | awk '{ print sprintf("%.9f", $1); }'

生產

0.123456000

要控制輸出的格式,您可以printf直接從shell 使用awk或直接通過 shell 使用。

但是,您也可以使用直接控制輸出du。例如,您可以指定-h以人類可讀的格式輸出結果。

例子

$ du -h --max-depth=1 /home/saml/apps | tail -1
9.0G    /home/saml/apps

$ du -h --max-depth=1 /home/saml/apps/gCAD3D  | tail -1
1.1M    /home/saml/apps/gCAD3D

使用 printf 格式化

但是正如您所注意到的,您使用這種方法會失去解析度。因此,如果您真的想保持更高的解析度,則必須從du較低級別獲取值,然後格式化輸出以適應您想要的更高級別的單位。

例子

在 MB 的使用中du

$ du -m --apparent-size --max-depth=1 /home/saml/apps | tail -1
8916    /home/saml/apps

使用awk+ printf

$ DIVISOR=10487600
$ du --apparent-size --max-depth=1 /home/saml/apps | \
     tail -1 | awk -v D=$DIVISOR '{printf "%.9f\n", $1/D}'
0.870499638

您可以通過將參數更改為 來控制所需的精度printf。這裡有5個地方。

$ DIVISOR=10487600
$ du --apparent-size --max-depth=1 /home/saml/apps | \
     tail -1 | awk -v D=$DIVISOR '{printf "%.5f\n", $1/D}'
0.87050

請注意,在您決定切斷精度的任何地方都要注意正確地舍入它。

引用自:https://unix.stackexchange.com/questions/104332