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

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

Технически это можно рассматривать как sh / bash / etc. вопрос программирования, так что я думаю, что он имеет силу в любом месте.   —  person cupakob    schedule 22.10.2009

@Rob Hruska: да, я тоже думаю, что это программирование на bash … @abrashka: ответ на ваш первый и второй вопрос — НЕТ!   —  person cupakob    schedule 22.10.2009

См. также:  КОНСОЛЬ против ТЕРМИНАЛА против ОБОЛОЧКИ, разница между ними.
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 5
  1. cupakob

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

    fgrep -o f <file> | wc -l
    

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

    Этот не работает, если вам нужно подсчитать \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

  2. cupakob
    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
    

    Это станет примерно на треть быстрее, если вы уберете ненужные 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, но это можно передать по конвейеру, а не cated: tr -d 'A' < <file> | wc ... person cupakob; 16.11.2015

  3. cupakob

    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
    
  4. cupakob

    Если все, что вам нужно сделать, это подсчитать количество строк, содержащих вашего персонажа, это сработает:

    grep -c 'f' myfile
    

    Тем не менее, он считает несколько вхождений ‘f’ в одной строке как одно совпадение.

  5. cupakob

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

    tr -cd f < file | wc -c
    

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

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

    Время для ответа Вереба с echo, cat, tr и bc для того же файла:

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

    Пришло время ответить Робу Хруске tr, sed и wc для того же файла:

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

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

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

    Для подсчета нескольких символов, например 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

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: