这是某些数字程序的常见输出,例如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
的经验不足。
非常感谢你。
答案 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
为例。
\d{1,3}
匹配一个或两个或三个数字。如果它被包裹在一个捕获组中,相应的数字不仅会匹配,而且还会被捕获。
首先,正则表达式引擎将匹配第一个数字7
并检查数字7后面是否是3的倍数的数字。因此数字7后跟{{1} }数字后面跟着一个单词边界。 12是3的倍数。因此它捕获相应的数字12
。在这里,单词边界7
是必须的,它在单词字符和非单词字符之间匹配。
接下来检查下一个数字9,后跟11个数字。因此它不会仅捕获数字\b
。因为我们定义了9
,所以它需要两个数字\d{1,3}
并检查以下数字。因为它后跟10个数字,它们不是3的倍数。因此它也会捕获下一个数字,即98
,然后检查以下数字。现在它后跟一个9位数字。因此将捕获相应的三位数5
。同样,它会跟随正好三位数字和一个单词边界的数字。
用985
替换所有匹配的字符,即组索引1中的字符加上逗号将为您提供所需的输出。
对于大数字,您可以增加正向前瞻中的范围计数,例如\1