计算纯文本文件中字符的出现次数
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,将文件名作为参数提供给 wc
和 tr
,速度会***分之一。
如果你真的想优化这个,只读取一次文件: echo $(stat -c%s stdin
,但可以通过管道而不是 cat
ed: tr -d 'A' < <file> | wc ...
【参考方案2】:
tr -d '\n' < file | sed 's/A/A\n/g' | wc -l
将两次出现的“A”替换为您的角色,将“file”替换为您的输入文件。
tr -d '\n' < 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
答案确实适用。
计算几个字符,例如a
、b
和 c
,使用 egrep
: egrep -o 'a|b|c' <file> | 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 用echo
、cat
、tr
和bc
回答同一个文件的时间:
real 0m0.168s
user 0m0.059s
sys 0m0.115s
Rob Hruska 用tr
、sed
和wc
回答同一个文件的时间:
real 0m0.465s
user 0m0.411s
sys 0m0.080s
Jefromi 用fgrep
和wc
回答同一文件的时间:
real 0m0.522s
user 0m0.477s
sys 0m0.023s
【讨论】:
计算几个字符,例如a
、b
和 c
:tr -cd abc < file | wc -l
。
你确定吗?不应该是tr -cd abc < file | wc -c
以上是关于计算纯文本文件中字符的出现次数的主要内容,如果未能解决你的问题,请参考以下文章