统计文本文件中字符的出现次数
概述
我们将学习如何使用Linux命令来获取输入文件中特定字符出现的次数。
我们假设您了解一些常见的Linux命令,包括grep、awk和tr。
我们还假设我们的输入文件tpoint.txt包含一些虚拟数据。
$ cat tpoint.txt "I Love Tpoint!!!" "Tpoint is great!!!"
在本教程的其余部分,我们将使用tpoint.txt进行演示。
使用grep命令
grep命令用于在输入文件中查找特定字符串。
我们现在来看一下获取文件中字符数的命令:
$ grep -o 'e' tpoint.txt | wc -l 4
我们正在搜索文件tpoint.txt中字母“e”的出现次数。-o选项在不同的行中显示匹配的部分。
现在我们使用“|”符号将grep程序的输出连接到wc程序的输入。wc命令中的-l选项告诉我们给定文件中共有多少行。
不区分大小写的搜索
grep命令允许使用-i选项进行不区分大小写的搜索。
$ grep -o -i 'l' tpoint.txt | wc -l 3
使用多个输入文件
您可以使用grep命令同时检查多个输入。例如,如果您想知道文本文件中每一行的长度,您可以运行以下命令:
$ cat > dummy.txt This is dummy text. $ grep -o -i 'e' tpoint.txt dummy.txt | wc -l 5
我们添加了一个名为dummy.txt的新文件,并对重命名为tpoint.text的文件和dummy.txt进行了字符计数。
我们使用grep命令计算每个文件中的字符数。结果包括两个文件中字符的总数。
使用tr命令
tr是一个用于执行基于字符的转换的工具。
我们可以组合-c和-d两个选项来获取字符数:
$ tr -c -d 'l' < tpoint.txt | wc -c 2
让我们首先了解上述命令中使用的选项。
−c − 此选项将取集合的补集
−d − 它将删除集合中提到的所有字符
字符串定义为一系列字符。在我们的示例中,字符串只是一个字母l。
当我们将-c和-d选项组合在一起时,它将删除除-d选项指定的字符之外的所有内容。
结果字符串将使用管道符号(|)通过管道传输到wc命令。wc命令中的-c选项将返回字符的总数。
不区分大小写的搜索
您可以通过将大小写字母都添加到集合中来执行不区分大小写的搜索。
$ tr -cd 'lL' < tpoint.txt | wc -c 3
使用awk命令
Awk是一个用于处理文本文件的编程工具。它从输入文件读取行,对每一行执行某些操作,然后将修改后的行写回另一个文件。
与我们目前为止讨论的两种方法不同,这种方法有点难以理解。
让我们来看一下这个命令以及它是如何工作的。
$ awk -F 'e' '{s+=(NF-1)} END {print s}' tpoint.txt 4
awk命令行工具使用的默认字符是空格。但是在这里,我们使用-F命令行参数用e替换了默认字段分隔符。我们希望为每个“e”的实例将我们的数据分成两列。
要获取每行的字符数,我们需要将每一行的长度加起来,然后除以总行数。我们可以使用以下代码来实现这一点:我们将每个单词的计数加起来,最后得到整个文档的字符出现总数。
性能比较
我们目前为止讨论的所有三种方法都是通过执行相同的基本任务来运行的。但是,它们之间的区别在于它们处理数据的方式。
对于小的字符串或小文件,这些命令的执行时间几乎相同。但是,当文件大小过大时,它们之间的真正区别就显现出来了。
让我们对一个1.1 GB的文件运行所有这三个命令行,看看哪个命令花费的时间更少。
$ ls -lah large.txt -rw-r--r--. 1 root root 1.1G Jun 12 10:53 large.txt $ time grep -o 'e' large.txt | wc -l 82256735 real 0m40.733s user 0m39.649s sys 0m0.714s $ time tr -c -d 'e' < large.txt | wc -c 82256735 real 0m2.542s user 0m1.892s sys 0m0.433s $ time awk -Fe '{s+=(NF-1)} END {print s}' large.txt 82256735 real 0m11.080s user 0m9.589s sys 0m0.933s
对于大型文件中的字符计数,tr命令是这三种命令中速度最快的。
结论
我们学习了查找文本文档中字符数的不同方法。我们讨论了一些特殊情况,例如不区分大小写的搜索和从多个输入文件中搜索。
我们发现tr命令比awk或grep命令运行速度更快。