在 Linux 系统中通信数字:并非看起来那么简单 在 Linux 系统中通信数字:并非看起来那么简单

在 Linux 系统中通信数字:并非看起来那么简单

Commify今天我需要处理大量的 PostgreSQL 数据库表,并统计每个表的行数。得到这些数据后,我还需要进行一些额外的计算,然后以美观的格式输出结果。由于一些原因(此处不赘述),我不得不使用 shell 脚本。

但这一切都微不足道……直到我看到最后一部分。它涉及到沟通。

这算是个词吗?我的浏览​​器拼写检查器认为不是,而且它也不知道“commify”是什么意思。你可能以为“commification”是上世纪50年代用来形容马克思主义传播的词,但它的意思是“在数字后面加逗号”。换句话说,就是把100000000变成100,000,000。

当然,在某些国家,人们看到100,000,000会问为什么有两位小数。而在印度,他们会期望这个数字的格式是1,00,00,00,00,这对我来说就像100,000,000对印度人来说一样令人困惑。但无论你身处何地,问题都是一样的。

Linux 提供了许多工具,可以对字母、数字和符号组成的字符串进行转换、剪切、解析、分割、合并、折叠、弯曲、替换、修改,几乎可以进行任何操作。事实上,文本处理是 Unix 最强大的功能之一。早期,Unix 的主要用途就是处理文本。

然而,乍一看,我没找到任何适用于 Linux 的简单通讯工具。我有一些用 Python 和 Perl 实现的小片段,但应该有一种更简单的命令行方法,对吧?

错误的。

有些人为此编写了大量的脚本。去掉脚本中的注释和空行,总共有 20 行。整整 20 行解释执行的 shell 代码,仅仅是为了格式化一个数字!

幸运的是,我们不需要这样做。我们可以用一行代码完成:

 $ 回显 100000000 | sed ':a;s/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g;ta'
     1亿美元

好了,这很简单,对吧?咱们逐字逐句地分析一下 sed 命令……等等,别走!我开玩笑的。顺便说一句,这只适用于 GNU sed—— sed FAQ 里还讨论了其他选项

但请不要浪费时间。让我来向您展示一种简单易记的方法。

请看这里:

 $ echo 100000000 | printf "%'d\n" 100000000
     1亿美元

不错!这在足够新的 bash 和 ksh 版本(93+ – 如果你在 2022 年还在使用 ksh88,你需要咨询一下心理医生)中都能正常工作。

% 符号后面的撇号告诉 printf 函数进行合并。

如果有人认为我写这篇文章是为了下次我在谷歌上搜索如何操作时能找到它,那可能就说对了。