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


132

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


9
从技术上讲,这可以被认为是sh / bash / etc。编程问题,所以我认为这在任何地方都有效。
罗布·赫鲁斯卡

@Rob Hruska:是的,我也认为是bash编程... @abrashka:您的第一个和第二个问题的答案是“否”!
cupakob

Answers:


178

这个怎么样:

fgrep -o f <file> | wc -l

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


如果您需要计数\r\n字符,此功能将无效。的tr -cd f回答不工作了点。
13年

3
要算几个字符,例如abc使用egrepegrep -o 'a|b|c' <file> | wc -l
Skippy le Grand Gourou

另外,请注意不要wc -ctr答案中使用:由于grep逐行输出,wc会将行尾计为字符(因此,字符数加倍)。
Skippy le Grand Gourou

@bjnord好的\r,但是要计数\n为什么不只使用wc -l
Skippy le Grand Gourou

67

甚至更快:

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

时间罗布Hruska的回答有trsedwc为同一个文件:

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

时间Jefromi答案与fgrepwc相同的文件:

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

3
要算几个字符,例如abctr -cd abc < file | wc -l
Skippy le Grand Gourou

你确定吗?没有假设是tr -cd abc < file | wc -c代替
大额牛乙

10
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

1
如果删除不必要的cats,将文件名作为wcand 的参数,则速度会提高三分之一tr
卡斯卡贝尔

1
如果确实要优化,则只读取一次文件:echo $(stat -c%s <file>)-$(cat <file> | tr -d'A'| wc -c)| BC
Vereb

@Vereb-tr仅读取stdin,但是可以通过管道而不是cated 来读取:tr -d 'A' < <file> | wc ...
dsz

7

如果您所需要做的就是计算包含字符的行数,那么它将起作用:

grep -c 'f' myfile

但是,它将同一行中多次出现的“ f”计为一次匹配。


4

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.