Подсчет вхождений символа в текстовый файл

132

Есть ли способ в linux / terminal подсчитать, сколько раз char f встречается в текстовом файле?

cupakob
источник
9
Технически это можно рассматривать как sh / bash / etc. вопрос программирования, так что я думаю, что он справедлив в любом месте.
Роб Хруска,
@Rob Hruska: да, я тоже думаю, что это программирование на bash ... @abrashka: ответ на ваш первый и второй вопрос - "НЕТ"!
cupakob

Ответы:

178

Как насчет этого:

fgrep -o f <file> | wc -l

Примечание: помимо того, что намного проще запоминать / дублировать и настраивать, это примерно в три раза (извините, редактировать! Испортил первый тест) быстрее, чем ответ Вереба.

Cascabel
источник
Этот не работает, если вам нужно считать \rили \nсимволы; tr -cd fответ делает работу для этого.
bjnord 05
3
Рассчитывать несколько символов, например a, bи cиспользуйте egrep: egrep -o 'a|b|c' <file> | wc -l.
Скиппи ле Гран Гуру,
Кроме того, будьте осторожны, чтобы НЕ использовать, wc -cкак в trответе: поскольку grepвыходные данные построчно, wcконец строк будет считаться как символы (следовательно, количество символов удваивается).
Скиппи ле Гран Гуру
@bjnord Хорошо \r, но чтобы посчитать, \nпочему бы просто не использовать wc -l?
Скиппи ле Гран Гуру,
68

даже быстрее:

tr -cd f < file | wc -c

Время для этой команды с файлом размером 4,9 МБ и 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 Hruška ответа с tr, sedи wcдля того же файла:

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

Пора Джефроми ответить с тем же файлом fgrepи wcдля него:

real   0m0.522s
user   0m0.477s
sys    0m0.023s 
user1985553
источник
3
Рассчитывать несколько символов, например a, bи c: tr -cd abc < file | wc -l.
Скиппи ле Гран Гуру
Ты уверен? не предполагалось tr -cd abc < file | wc -cвместо этого
Митхун Би
10
echo $(cat <file>  | wc -c) - $(cat <file>  | tr -d 'A' | wc -c) | bc

где A - символ

Время для этой команды с файлом размером 4,9 МБ и 1100000 вхождений искомого символа:

real   0m0.168s
user   0m0.059s
sys    0m0.115s
Vereb
источник
1
Это будет примерно на треть быстрее, если вы удалите ненужные cats, указав имя файла в качестве аргумента wcи tr.
Cascabel
1
Если вы действительно хотите оптимизировать, это читает файл только один раз: echo $ (stat -c% s <file>) - $ (cat <file> | tr -d 'A' | wc -c) | bc
Вереб
@Vereb - tr только читает stdin, но это может быть cattr -d 'A' < <file> | wc ...
передано по
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
Роб Хруска
источник