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

Sop*_*rez 5 linux bash numbers

这是一些像 Word-Count ( wc)这样的数字程序的常见输出:

$ wc MyLongFile.txt -l
985734902867 MyLongFile.txt
Run Code Online (Sandbox Code Playgroud)

我想知道有什么方法可以过滤数字部分,以便变得更具可读性,例如:

985.734.902.867 MyLongFile.txt
Run Code Online (Sandbox Code Playgroud)

许多程序都有一些-h(for human readable) 选项,但是了解一些可以在函数或别名中实现的通用方法会很好……或者至少键入,如果它不是很长的话。

我想该方法需要添加一个.每 3 个数字连接的组,但从右侧开始。

方法不改变非数字部分是优选的。如果可能,请考虑在数字左侧包含字母(或任何其他字符)的可能性,例如:

ls -la
-rw-rw-r-- 1 luis luis  93342519 ene  1 00:22 tmp.txt
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现的最好的是这个sed命令:

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

...但是,正如您所看到的,它只能工作到数千,而且我在sed.

非常感谢你。

Avi*_*Raj 4

您可以通过 Perl 来完成此操作,它使用基于正向前瞻的正则表达式。

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

或者

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

例子:

$ 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

  3. 接下来,它检查下一个数字 9,其后是 11 位数字。所以它不会只捕获数字9。因为我们定义了\d{1,3},所以它需要两个数字 is98并检查后面的数字。因为它后面跟着 10 个数字,这些数字不是 3 的倍数。所以它也捕获下一个数字,5然后检查后面的数字。现在它后面跟着一个 9 位数字。这样相应的三位数字985就会被捕获。同样,它上升到数字,后面紧跟着三位数字和一个字边界。

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

  5. 您可以增加大数字的正前瞻内的范围计数,例如(?=(?:\d{3}){1,10}\b