Linux shell:为数字输出添加点以使其更具可读性

时间:2015-01-01 00:42:04

标签: linux bash numbers

这是某些数字程序的常见输出,例如Word-Count(wc):

$ wc MyLongFile.txt -l
985734902867 MyLongFile.txt

我想知道某些方法过滤数字部分,以便成为更具可读性的东西:

985.734.902.867 MyLongFile.txt

许多程序都有一些-h(适用于human readable)选项,但是可以了解一些可以在函数或别名中实现的泛型方法。 ..或者至少输入,如果不是很长。

我认为该方法需要在每个3个数字连接组中添加.,但从右侧开始。

方法不更改首选非数字部分。如果可能的话,考虑在数字的左侧有字母(或任何其他字符)的可能性,如:

ls -la
-rw-rw-r-- 1 luis luis  93342519 ene  1 00:22 tmp.txt

直到现在我发现的最好的是sed命令:

$ wc MyLongFile.txt -l | sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2.\3/g'
985734902,867 MyLongFile.txt

...但是,正如你所看到的那样,它只能工作到数千人,而且我对sed的经验不足。

非常感谢你。

1 个答案:

答案 0 :(得分:2)

你可以通过Perl使用基于前瞻性的正面正则表达式来做到这一点。

perl -pe 's/(\d{1,3})(?=(?:\d{3}){1,5}\b)/\1,/g' file

OR

wc MyLongFile.txt -l | perl -pe 's/(\d{1,3})(?=(?:\d{3}){1,5}\b)/\1,/g'

示例:

$ cat file
7985734902867 MyLongFile.txt
734902867 MyLongFile1.txt
$ perl -pe 's/(\d{1,3})(?=(?:\d{3}){1,5}\b)/\1,/g' file
7,985,734,902,867 MyLongFile.txt
734,902,867 MyLongFile1.txt

这就像正则表达式乘法。让我解释它是如何工作的。以此7985734902867 MyLongFile.txt为例。

  1. \d{1,3}匹配一个或两个或三个数字。如果它被包裹在一个捕获组中,相应的数字不仅会匹配,而且还会被捕获。

  2. 首先,正则表达式引擎将匹配第一个数字7并检查数字7后面是否是3的倍数的数字。因此数字7后跟{{1} }数字后面跟着一个单词边界。 12是3的倍数。因此它捕获相应的数字12。在这里,单词边界7是必须的,它在单词字符和非单词字符之间匹配。

  3. 接下来检查下一个数字9,后跟11个数字。因此它不会仅捕获数字\b。因为我们定义了9,所以它需要两个数字\d{1,3}并检查以下数字。因为它后跟10个数字,它们不是3的倍数。因此它也会捕获下一个数字,即98,然后检查以下数字。现在它后跟一个9位数字。因此将捕获相应的三位数5。同样,它会跟随正好三位数字和一个单词边界的数字。

  4. 985替换所有匹配的字符,即组索引1中的字符加上逗号将为您提供所需的输出。

  5. 对于大数字,您可以增加正向前瞻中的范围计数,例如\1