这是和一些数字程序(例如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的经验还不是很丰富。

非常感谢

最佳答案

您可以通过使用基于正向超前正则表达式的Perl来执行此操作。

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

或者
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为例。
  • \d{1,3}匹配一位或两位或三位数字。如果将其包装在捕获组中,则不仅数字匹配gt,而且还将捕获相应的数字。
  • 首先,正则表达式引擎将与第一个数字7匹配,并检查数字7之后是否是3的倍数的数字。因此,数字7之后是12数字,再次是单词边界。 12是3的倍数。因此它捕获了相应的数字7。在这里,单词边界\b是一个必不可少的单词,它在单词字符和非单词字符之间匹配。
  • 接下来,它检查下一个数字9,然后是11个数字。因此,它不会仅捕获9数字。因为我们定义了\d{1,3},所以它采用了两位数字即98并检查以下数字。因为它后跟10位数字,而不是3的倍数,所以它也捕获下一位数字,即5,然后检查接下来的数字。现在,它后面是一个9位数字。因此,将捕获相应的三位数985。同样,它上升到一个数字,紧随其后的是三个数字和一个单词边界。
  • \1替换所有匹配的字符,即组索引1中的字符加上一个逗号将为您提供所需的输出。
  • 对于大数,您可以在正向提前范围内增加范围计数,例如(?=(?:\d{3}){1,10}\b
  • 关于Linux Shell : Adding dots to numerical outputs to make them more readable,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27727550/

    10-16 03:50