144

Is there any way under linux/terminal to count, how many times the char f occurs in a plain text file?

2
  • 9
    Technically this could be considered a sh/bash/etc. programming question, so I think it has validity in either place. Commented Oct 21, 2009 at 21:51
  • @Rob Hruska: yes, I also think is bash programming... @abrashka: the answer for your first and second question is "NO"! Commented Oct 22, 2009 at 7:33

5 Answers 5

189

How about this:

fgrep -o f <file> | wc -l 

Note: Besides much easier to remember/duplicate and customize, this is about three times (sorry, edit! botched the first test) faster than Vereb's answer.

Sign up to request clarification or add additional context in comments.

5 Comments

This one doesn't work if you need to count \r or \n characters; the tr -cd f answer does work for that.
To count several characters, e.g. a, b and c, use egrep : egrep -o 'a|b|c' <file> | wc -l.
Also, beware to NOT use wc -c as in the tr answer : since grep outputs line by line, wc would count end-of-lines as characters (hence doubling the number of characters).
@bjnord Ok for \r, but to count \n why not just use wc -l ?
Warning: fgrep is obsolescent; use grep -F. e.g. grep -oF f <file> | wc -l
77

even faster:

tr -cd f < file | wc -c 

Time for this command with a file with 4.9 MB and 1100000 occurences of the searched character:

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

Time for Vereb answer with echo, cat, tr and bc for the same file:

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

Time for Rob Hruska answer with tr, sed and wc for the same file:

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

Time for Jefromi answer with fgrep and wc for the same file:

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

2 Comments

To count several characters, e.g. a, b and c : tr -cd abc < file | wc -l.
are you sure? wasn't suppose to be tr -cd abc < file | wc -c instead
10
echo $(cat <file> | wc -c) - $(cat <file> | tr -d 'A' | wc -c) | bc 

where the A is the character

Time for this command with a file with 4.9 MB and 1100000 occurences of the searched character:

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

3 Comments

This gets about a third faster if you take out the unnecessary cat s, giving the filename as an argument to wc and tr.
If you realy want to optimize this reads the file just once: echo $(stat -c%s <file>) - $(cat <file> | tr -d 'A' | wc -c) | bc
@Vereb - tr only reads stdin, but that can be piped rather than cated: tr -d 'A' < <file> | wc ...
8

If all you need to do is count the number of lines containing your character, this will work:

grep -c 'f' myfile 

However, it counts multiple occurrences of 'f' on the same line as a single match.

Comments

4

tr -d '\n' < file | sed 's/A/A\n/g' | wc -l

Replacing the two occurrences of "A" with your character, and "file" with your input file.

  • tr -d '\n' < file: removes newlines
  • sed 's/A/A\n/g: adds a newline after every occurrence of "A"
  • wc -l: counts the number of lines

Example:

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.