Есть ли способ в linux / terminal подсчитать, сколько раз char f встречается в текстовом файле?
Технически это можно рассматривать как sh / bash / etc. вопрос программирования, так что я думаю, что он имеет силу в любом месте. — person cupakob schedule 22.10.2009
@Rob Hruska: да, я тоже думаю, что это программирование на bash … @abrashka: ответ на ваш первый и второй вопрос — НЕТ! — person cupakob schedule 22.10.2009
Как насчет этого:
Примечание: помимо того, что намного проще запоминать / дублировать и настраивать, это примерно в три раза (извините, редактировать! Испортил первый тест) быстрее, чем ответ Вереба.
Этот не работает, если вам нужно подсчитать
\r
или\n
символов;tr -cd f
ответ действительно подходит для этого. — person cupakob; 05.10.2013Для подсчета нескольких символов, например
a
,b
иc
используйтеegrep
:egrep -o 'a|b|c' <file> | wc -l
. — person cupakob; 03.04.2017Также будьте осторожны, НЕ используйте
wc -c
, как в ответеtr
: посколькуgrep
выводит строку за строкой,wc
будет считать концы строк как символы (следовательно, количество символов удваивается). — person cupakob; 03.04.2017@bjnord Хорошо для
\r
, но для подсчета\n
почему бы просто не использоватьwc -l
? — person cupakob; 03.04.2017где A — символ
Время для этой команды с файлом размером 4,9 МБ и 1100000 вхождений искомого символа:
Это станет примерно на треть быстрее, если вы уберете ненужные
cat
s, указав имя файла в качестве аргумента дляwc
иtr
. — person cupakob; 22.10.2009Если вы действительно хотите оптимизировать, это читает файл только один раз: echo $ (stat -c% s ‹file›) — $ (cat ‹file› | tr -d ‘A’ | wc -c) | до н.э — person cupakob; 22.10.2009
@Vereb — tr читает только
stdin
, но это можно передать по конвейеру, а неcat
ed:tr -d 'A' < <file> | wc ...
— person cupakob; 16.11.2015tr -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
: подсчитывает количество строкПример:
Если все, что вам нужно сделать, это подсчитать количество строк, содержащих вашего персонажа, это сработает:
Тем не менее, он считает несколько вхождений ‘f’ в одной строке как одно совпадение.
даже быстрее:
Время для этой команды с файлом размером 4,9 МБ и 1100000 вхождений искомого символа:
Время для ответа Вереба с
echo
,cat
,tr
иbc
для того же файла:Пришло время ответить Робу Хруске
tr
,sed
иwc
для того же файла:Пора Джефроми ответить
fgrep
иwc
для того же файла:Для подсчета нескольких символов, например
a
,b
иc
:tr -cd abc < file | wc -l
. — person cupakob; 03.04.2017вы уверены? не предполагалось быть
tr -cd abc < file | wc -c
вместо этого — person cupakob; 09.05.2020