Is there any way under linux/terminal to count, how many times the char f occurs in a plain text file?
- 9Technically this could be considered a sh/bash/etc. programming question, so I think it has validity in either place.Rob Hruska– Rob Hruska2009-10-21 21:51:11 +00:00Commented 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"!cupakob– cupakob2009-10-22 07:33:33 +00:00Commented Oct 22, 2009 at 7:33
5 Answers
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.
5 Comments
\r or \n characters; the tr -cd f answer does work for that.a, b and c, use egrep : egrep -o 'a|b|c' <file> | wc -l.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).\r, but to count \n why not just use wc -l ?fgrep is obsolescent; use grep -F. e.g. grep -oF f <file> | wc -leven 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
a, b and c : tr -cd abc < file | wc -l.tr -cd abc < file | wc -c insteadecho $(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
cat s, giving the filename as an argument to wc and tr.stdin, but that can be piped rather than cated: tr -d 'A' < <file> | wc ...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 newlinessed '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