如何将 Bash 中单列中每一行的字节转换为千兆字节? 我试过这个:
echo "scale=2; $(cat file.log) / 1024^2" | bc
但仅转换最后一个值。
file.log内容示例:
2171863040
1693491200
1984045056
(中间没有空格)
你可以使用
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
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
...虽然我怀疑他们的意思,但清楚、具体和准确是件好事。
如果您想重新计算一行中的每个字段(空格分隔)。
这个
awk
脚本可以完成这项工作。
awk '{for (i = 1; i <= NF; i++) $i = ($i/(1024*1024*1024)); print }' file.log