将每行中的字节转换为 GB

Dis*_*ame 2 bash awk sed

如何在 Bash 中单列的每一行中将字节转换为千兆字节?我已经尝试过这个:

echo "scale=2; $(cat file.log) / 1024^2" | bc
Run Code Online (Sandbox Code Playgroud)

但只转换最后一个值。

file.log 内容示例:

   2171863040
   1693491200
   1984045056
Run Code Online (Sandbox Code Playgroud)

(之间没有空格)

cdu*_*dub 7

你可以使用awk

$ cat file.log
1073741824 1073741824

$ awk '{print $1/1024/1024/1024 " GB " $2/1024/1024/1024 " GB"}' file.log
1 GB 1 GB
Run Code Online (Sandbox Code Playgroud)

或使用您刚刚发布的示例数据:

$ awk '{print $1/1024/1024/1024 " GB "}' file.log
2.02271 GB
1.57719 GB
1.84779 GB
Run Code Online (Sandbox Code Playgroud)


Pau*_*ges 5

awk会更快 -

awk '{ printf "%.2f\n", $1/1024/1024/1024; }' file.log
Run Code Online (Sandbox Code Playgroud)

bc需要一个循环。

 while read b
 do bc <<< "scale=2; $b / 1024^3" # shouldn't GB be ^3?
 done < file.log
Run Code Online (Sandbox Code Playgroud)

两者产量

2.02
1.58
1.85
Run Code Online (Sandbox Code Playgroud)

编辑 -

新的赞成票让我再次审视这一点。其他地方的评论不准确,但有道理

我正在转换为gibi字节(2 的幂),而不是giga字节(10 的幂)。我认为这就是我们想要的,因为技术上普遍存在错误的用法。

如果 OP 实际上意味着他们想要 10 的幂而不是 2,只需将 1024 切换为 1000 -

awk '{for (i = 1; i <= NF; i++) $i = ($i/(1000*1000*1000)); print }' file.log
Run Code Online (Sandbox Code Playgroud)

...虽然我怀疑他们的意思,但最好是清晰、具体和准确。

  • 太棒了,感谢您提供限制小数位数的示例;) (2认同)