Linux shell:在数字输出中添加点以使其更具可读性
Linux shell: Adding dots to numerical outputs to make them more readable
这是 一些数字程序 的常见输出,例如 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\}\)/./g'
985734902,867 MyLongFile.txt
...但是,如您所见,它只能工作到几千,而且我在 sed
上不是很有经验。
非常感谢。
您可以通过 Perl 来做到这一点,它使用基于正则表达式的前瞻性。
perl -pe 's/(\d{1,3})(?=(?:\d{3}){1,5}\b)/,/g' file
或
wc MyLongFile.txt -l | perl -pe 's/(\d{1,3})(?=(?:\d{3}){1,5}\b)/,/g'
示例:
$ cat file
7985734902867 MyLongFile.txt
734902867 MyLongFile1.txt
$ perl -pe 's/(\d{1,3})(?=(?:\d{3}){1,5}\b)/,/g' file
7,985,734,902,867 MyLongFile.txt
734,902,867 MyLongFile1.txt
这就像一个正则表达式乘法。让我解释一下它是如何工作的。以这个 7985734902867 MyLongFile.txt
为例。
\d{1,3}
匹配单个数字或两个或三个。如果它被包裹在一个捕获组中,相应的数字不仅会被匹配,还会被捕获。
首先,正则表达式引擎会匹配第一个数字 7
并检查数字 7 后面是否跟有 3 的倍数的数字。所以数字 7 后面跟着12
位数字后跟单词边界。 12 是 3 的倍数。所以它捕获相应的数字 7
。这里单词边界 \b
是必须的,它匹配单词字符和非单词字符。
接下来它检查下一个数字 9,后面跟着 11 个数字。所以它不会只捕获数字 9
。因为我们定义了 \d{1,3}
,它需要两个数字 98
并检查后面的数字。因为它后面跟着 10 个不是 3 的倍数的数字。所以它也捕获下一个数字,即 5
,然后检查后面的数字。现在它后面跟着一个 9 位数字。所以相应的三位数字985
会被捕获。同样,它上升到紧跟三个数字和一个单词边界的数字。
用 </code> 替换所有匹配的字符,即组索引 1 内的字符加上逗号将为您提供所需的输出。</p></li>
<li><p>你可以增加大数的正前瞻内的范围计数,比如 <code>(?=(?:\d{3}){1,10}\b
这是 一些数字程序 的常见输出,例如 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\}\)/./g'
985734902,867 MyLongFile.txt
...但是,如您所见,它只能工作到几千,而且我在 sed
上不是很有经验。
非常感谢。
您可以通过 Perl 来做到这一点,它使用基于正则表达式的前瞻性。
perl -pe 's/(\d{1,3})(?=(?:\d{3}){1,5}\b)/,/g' file
或
wc MyLongFile.txt -l | perl -pe 's/(\d{1,3})(?=(?:\d{3}){1,5}\b)/,/g'
示例:
$ cat file
7985734902867 MyLongFile.txt
734902867 MyLongFile1.txt
$ perl -pe 's/(\d{1,3})(?=(?:\d{3}){1,5}\b)/,/g' file
7,985,734,902,867 MyLongFile.txt
734,902,867 MyLongFile1.txt
这就像一个正则表达式乘法。让我解释一下它是如何工作的。以这个 7985734902867 MyLongFile.txt
为例。
\d{1,3}
匹配单个数字或两个或三个。如果它被包裹在一个捕获组中,相应的数字不仅会被匹配,还会被捕获。首先,正则表达式引擎会匹配第一个数字
7
并检查数字 7 后面是否跟有 3 的倍数的数字。所以数字 7 后面跟着12
位数字后跟单词边界。 12 是 3 的倍数。所以它捕获相应的数字7
。这里单词边界\b
是必须的,它匹配单词字符和非单词字符。接下来它检查下一个数字 9,后面跟着 11 个数字。所以它不会只捕获数字
9
。因为我们定义了\d{1,3}
,它需要两个数字98
并检查后面的数字。因为它后面跟着 10 个不是 3 的倍数的数字。所以它也捕获下一个数字,即5
,然后检查后面的数字。现在它后面跟着一个 9 位数字。所以相应的三位数字985
会被捕获。同样,它上升到紧跟三个数字和一个单词边界的数字。用
</code> 替换所有匹配的字符,即组索引 1 内的字符加上逗号将为您提供所需的输出。</p></li> <li><p>你可以增加大数的正前瞻内的范围计数,比如 <code>(?=(?:\d{3}){1,10}\b