统计文本文件中某个字符的出现次数

linuxopen sourceoperating system更新于 2026/1/27 18:07:17

概述

我们将学习如何使用 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 命令都要快。


相关文章


有用资源