【问题标题】:Using perl to round number使用 perl 对数字进行舍入
【发布时间】:2021-03-18 09:43:14
【问题描述】:

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

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

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

目前,类似260.676914215088的结果

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

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

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

【问题讨论】:

  • 这能回答你的问题吗? stackoverflow.com/questions/35043874/…
  • 这没有回答我的问题,如果有人对上述 perl 语句提供帮助,我将不胜感激,因为我已经在使用它在不同单位之间进行更改
  • sprintf 在我的操作系统上不是一个选项
  • 那是什么操作系统?请向我们提供所有信息,否则我们无能为力。 sprintf 是内置的核心 Perl,它与系统无关。我现在已经撤消了重复关闭。
  • @simbabque 我相信他的问题不是 perl,而是将 printf 集成到他的 oneliner 中

标签: perl one-liner


【解决方案1】:

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

#                                         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

【讨论】:

  • 这正是我想要的!谢谢@simbabque
【解决方案2】:

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

意义
perl -pe 's{(?&lt;!\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

【讨论】:

  • 很遗憾,它不起作用,它给了零,请注意该文件包含其他字符和字符串
  • 我的数据样本:: 大小 = 98566144 总计 = 68334889 实际 = 3023123
  • 感谢@user2141046 其他答案按预期工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
相关资源
最近更新 更多