使用 Linux 命令来获取输入文件中特定字符的出现次数
概述
我们将学习如何使用 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
我们添加了一个名为 dommy 的新文件.txt并对该文件(已从 tpoint.text 重命名)和 dommmy.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 命令快。