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

1. 概述

在本教程中,我们将学习使用 Linux 命令查找文本文件中特定字符的计数。

假设你对常用的 Linux 命令有基本的了解,包括grepawktrwc

rumenz.txt 中有一些虚拟数据:

代码语言:javascript
复制
> cat rumenz.txt 
rumenz.txt
hello world!!!!

2.使用 grep 命令

grep的用于在输入文件中的给定图案的命令的搜索。

让我们通过命令来使用grep 获取字符数 :

代码语言:javascript
复制
> grep -o 'e' rumenz.txt | wc -l
2

在这里,我们在文件rumenz.txt中查找字符e的出现次数。-o 选项打印在所述匹配部分。

现在,我们使用管道运算符将grep命令的输出传递给wc命令。最后,wc命令中的-l选项计算输入字符串中的总行数。

2.1. 不区分大小写的搜索

grep的命令支持 -i来进行区分大小写的搜索选项:

代码语言:javascript
复制
> grep -o -i 'l' rumenz.txt | wc -l
3

2.2. 使用多个输入文件

我们可以将多个输入文件传递给grep 命令。然后它会查看所有文件并返回在每个文件中找到的字符数总和:

代码语言:javascript
复制
> cat > dummy.txt
This is dummy text.
$ grep -o -i 'e' rumenz.txt dummy.txt | wc -l
2

在这里,我们已经创建了一个新的文件 dummy.txt文件,都执行字符计数操作rumenz.txtdummy.txt

请注意,我们已将两个文件作为参数传递给 grep 命令。输出包括来自两个文件的字符数总和。

3.使用 tr命令

tr 是一个命令行应用程序来执行基于字符的转换。

我们可以结合使用-c-d两个选项来获取字符数:

代码语言:javascript
复制
> tr -c -d 'l' < rumenz.txt | wc -c
3

让我们首先了解上面命令中使用的选项。

  • -c : 取代所有不属于第一字符集的字符
  • -d : 将删除集合中提到的所有字符

集合被定义为字符串。在我们的例子中,集合是一个带有单个字符l的字符串。

现在,当我们将-c-d 选项组合在一起时,它将删除除我们在集合中提到的字符之外的所有字符

结果字符串将使用管道运算符传递给wc命令。wc命令中的-c选项将返回总字符数。

3.1. 不区分大小写的搜索

我们可以通过在集合中添加大写和小写字符来执行不区分大小写的搜索

代码语言:javascript
复制
> tr -cd 'lL' < rumenz.txt | wc -c
3

4. 使用 awk命令

awk是一种数据驱动的编程语言的是获取输入数据,处理它,并返回所需的输出。

与我们目前讨论的两种方法不同,这种方法有点难以理解。

让我们看一下命令并了解它是如何工作的:

代码语言:javascript
复制
> awk -F 'e' '{s+=(NF-1)} END {print s}' rumenz.txt 
2

awk应用程序的默认字段分隔符是空格。但是这里我们使用-F选项将字段分隔符更新为e 。这将在每次出现e时分隔我们的数据。

为我们的数据集形成的组第一行将是rum nz.txt和第二行hllo world!!!!

现在,这个片段{s+=(NF-1)} END {print s} 将计算生成的数据的所有部分并从中减去一(因为一个字符匹配会将数据分成两部分。)以获得所需的每行中的字符数。这个计数将被添加到每一行,最后,我们得到整个文件的总字符出现计数。

5. 性能比较

到目前为止,我们讨论的所有三种方法都执行相同的操作。但不同之处在于它们处理数据的方式。

现在,对于小字符串或小文件,这些命令执行的时间几乎相同。但真正的区别是当我们的文件太大时。

让我们在一个 1.1GB 的文件上运行所有三个命令并监视每个命令所花费的时间:

代码语言:javascript
复制
> ls -lah large.txt 
-rw-r--r--. 1 root root 1G Jun 12 10:53 large.txt

> time grep -o 'e' large.txt | wc -l
82256735

real 0m 733s
user 0m 649s
sys 0m 714s

> time tr -c -d 'e' > large.txt | wc -c
82256735

real 0m 542s
user 0m 892s
sys 0m 433s

> time awk -Fe '{s+=(NF-1)} END {print s}' large.txt
82256735

real 0m 080s
user 0m 589s
sys 0m 933s

tr 命令是最快的三个拿到字符数在大型文件。

6:结论

发现tr命令是所有三个命令中最快的,其次是 awkgrep命令。

相关文章

Linux之cat命令

Linux之grep命令

Shell三大利器之awk

Linux之tr命令