计算纯文本文件中字符的出现次数

Posted

技术标签:

【中文标题】计算纯文本文件中字符的出现次数【英文标题】:Count occurrences of a char in plain text file 【发布时间】:2010-12-08 21:09:54 【问题描述】:

在linux/terminal下有什么方法可以统计,纯文本文件中char f出现了多少次?

【问题讨论】:

从技术上讲,这可以被认为是 sh/bash/etc。编程问题,所以我认为它在任何地方都有效。 @Rob Hruska:是的,我也认为是 bash 编程...... @abrashka:你的第一个和第二个问题的答案是“NO”! 【参考方案1】:
echo $(cat <file>  | wc -c) - $(cat <file>  | tr -d 'A' | wc -c) | bc

A 是字符

使用 4.9 MB 文件和 1100000 次搜索字符出现此命令的时间:

real   0m0.168s
user   0m0.059s
sys    0m0.115s

【讨论】:

如果你去掉不必要的 cat s,将文件名作为参数提供给 wctr,速度会***分之一。 如果你真的想优化这个,只读取一次文件: echo $(stat -c%s ) - $(cat | tr -d 'A' | wc - c) |公元前 @Vereb - tr 只读取 stdin,但可以通过管道而不是 cated: tr -d 'A' &lt; &lt;file&gt; | wc ...【参考方案2】:

tr -d '\n' &lt; file | sed 's/A/A\n/g' | wc -l

将两次出现的“A”替换为您的角色,将“file”替换为您的输入文件。

tr -d '\n' &lt; file:删除换行符 sed 's/A/A\n/g:在每次出现“A”后添加一个换行符 wc -l:统计行数

例子:

$ cat file
abcdefgabcdefgababababbbba


1234gabca

$ tr -d '\n' < file | sed 's/a/a\n/g' | wc -l
9

【讨论】:

【参考方案3】:

这个怎么样:

fgrep -o f <file> | wc -l

注意:除了更容易记住/复制和自定义之外,这比 Vereb 的答案快大约三倍(抱歉,编辑!第一次测试失败)。

【讨论】:

如果需要统计\r\n字符,这个不行; tr -cd f 答案确实适用。 计算几个字符,例如abc,使用 egrep : egrep -o 'a|b|c' &lt;file&gt; | wc -l 另外,请注意不要使用wc -c,因为tr 答案:因为grep 逐行输出,wc 会将行尾计为字符(因此加倍字符数)。 @bjnord 可以使用\r,但要算上\n,为什么不直接使用wc -l【参考方案4】:

如果您需要做的就是计算包含您的角色的行数,这将起作用:

grep -c 'f' myfile

但是,它会将同一行中多次出现的 'f' 视为一次匹配。

【讨论】:

【参考方案5】:

更快:

tr -cd f < file | wc -c

此命令的时间,文件大小为 4.9 MB,搜索字符出现 1100000 次:

real   0m0.089s
user   0m0.057s
sys    0m0.027s

Vereb 用echocattrbc 回答同一个文件的时间:

real   0m0.168s
user   0m0.059s
sys    0m0.115s

Rob Hruska 用trsedwc 回答同一个文件的时间:

real   0m0.465s
user   0m0.411s
sys    0m0.080s

Jefromi 用fgrepwc 回答同一文件的时间:

real   0m0.522s
user   0m0.477s
sys    0m0.023s 

【讨论】:

计算几个字符,例如abctr -cd abc &lt; file | wc -l 你确定吗?不应该是tr -cd abc &lt; file | wc -c

以上是关于计算纯文本文件中字符的出现次数的主要内容,如果未能解决你的问题,请参考以下文章

计算一个单词在文本文件中出现的次数

如何使用 UNIX shell 计算一个字母在文本文件中出现的次数?

计算特定单词在 C++ 文本文件中出现的次数

C语言 统计文本文件中出现的次数最多和最少的字符串

Windows BAT:查找多个文件中出现的字符串

统计一个字符串在文本文件中的出现次数