统计文本文件中某个字符的出现次数
概述
我们将学习如何使用 Linux 命令获取输入文件中特定字符的出现次数。
我们假设您了解一些常见的 Linux 命令,包括 grep、awk 和 tr。
我们还假设输入文件 tpoint.txt 包含一些虚拟数据 -
$ cat tpoint.txt "我喜欢 Tpoint!!!" "Tpoint 太棒了!!!"
在本教程的其余部分,我们将使用 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 这是虚拟文本。 $ 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 命令都要快。
相关文章
有用资源
linux 参考教程 - 该教程包含有关 linux 的更多信息:https://www.cainiaomax.com/linux/

