将每行中的字节转换为GB

问题描述 投票:0回答:3

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

echo "scale=2; $(cat file.log) / 1024^2" | bc

但仅转换最后一个值。

file.log内容示例:

   2171863040
   1693491200
   1984045056

(中间没有空格)

bash awk sed
3个回答
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

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

$ awk '{print $1/1024/1024/1024 " GB "}' file.log
2.02271 GB
1.57719 GB
1.84779 GB

5
投票

awk
将会更干净、更简单、更快 -

awk '{ printf "%.2f\n", $1/1024/1024/1024; }' file.log
2.02
1.58
1.85

bc
需要一个循环,并且不能正确 round

$: while read b
>  do bc <<< "scale=2; $b / 1024^3" # shouldn't GB be ^3?
>  done < file.log
2.02
1.57
1.84

您可以使用

printf
和另一层子壳进行舍入...
删除
scale
并使用
bc -l
:

$: while read b; do printf '%.2f\n' $(bc -l<<<"$b/1024^3"); done < file.log
2.02
1.58
1.85

或一些程序将文件行格式化为

bc
的命令来代替循环 -

$: printf '%.2f\n' $( sed 's,$,/1024^3,' tmp | bc -l )
2.02
1.58
1.85

有一百万种方法可以做到这一点 - 有些或多或少有效,所以遵循 YMMV,做对你有意义的事情。

$: printf '%.2f\n' $( xargs -I@ printf "@/1024^3\n" < tmp | bc -l )
2.02
1.58
1.85

...但我只想使用

awk

编辑--

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

我正在转换为 gibi字节,即 2 的幂,而不是 giga字节,即 10 的幂。我认为这就是我们想要的,因为技术上的使用不正确。

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

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

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


3
投票

如果您想重新计算一行中的每个字段(空格分隔)。

这个

awk
脚本可以完成这项工作。

awk '{for (i = 1; i <= NF; i++) $i = ($i/(1024*1024*1024)); print }' file.log
© www.soinside.com 2019 - 2024. All rights reserved.