Есть ли способ в 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 вхождений искомого символа:
Это станет примерно на треть быстрее, если вы уберете ненужные
cats, указав имя файла в качестве аргумента для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, но это можно передать по конвейеру, а неcated: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