1

我有一个以 MB 为单位的数字文件,我想以 GB 为单位制作它们,然后我发现了一个非常有趣的 perl 来执行此操作

perl -pe 's{(?<!\d)(\d+(?:\.\d+)?)(?!\d)}{$1/1024}ge'

但我仍然需要在点后将结果四舍五入

目前,结果如260.676914215088

我尝试了一些其他的 Unix 工具cutbc但如果在 Perl 中完成会更好。

顺便说一句,该文件包含数字和字符串,上面的 Perl 按预期工作,但我仍然需要对结果进行四舍五入。

如果有人对上述 perl 语句提供帮助,我将不胜感激,因为我已经在使用它在不同单位之间进行更改

4

2 回答 2

3

您可以将sprintf调用嵌入到您的替换中。您已经有了修饰符/e因此您可以在替换部分运行该命令并将您正在执行的计算传递给它。

#                                         VVVVVVVVVVVVVVVV        V 
perl -pe 's{(?<!\d)(\d+(?:\.\d+)?)(?!\d)}{sprintf("%.02f", $1/1024)}ge'

在这里查看它的实际效果:

$ echo "1234567" | perl -pe 's{(?<!\d)(\d+(?:\.\d+)?)(?!\d)}{sprintf("%.02f", $1/1024)}ge'  
1205.63
于 2021-03-18T11:03:09.120 回答
0

由于您正在处理单线,因此您可以提供的管道数量没有限制,因此只需将其添加到您的行中:perl -n -e 'printf ("%.2f\n",$_)'

意义
perl -pe 's{(?<!\d)(\d+(?:\.\d+)?)(?!\d)}{$1/1024}ge'| perl -n -e 'printf ("%.2f\n",$_)'

例如

> echo "12014.324\n10123123.1\n20123.5555" | perl -pe 's{(?<!\d)(\d+(?:\.\d+)?)(?!\d)}{$1/1024}ge' | perl -n -e 'printf ("%.2f\n", $_)'
11.73
9885.86
19.65
于 2021-03-18T10:40:38.690 回答