Как подсчитать количество вхождений слова в текстовый файл с помощью командной строки?

У меня есть большой файл JSON, который находится на одной строке, и я хочу использовать командную строку, чтобы иметь возможность подсчитать количество вхождений слова в файл. Как я могу это сделать?

$ tr ' ' '\n' < FILE | grep WORD | wc -l 

Где tr заменяет пробелы символами новой строки, grep фильтрует все результирующие строки, соответствующие WORD и wc подсчитывает оставшиеся.

Можно даже сохранить часть wc с помощью опции -c grep:

 $ tr ' ' '\n' < FILE | grep -c WORD 

Опция -c определяется POSIX.

Если не гарантируется наличие пробелов между словами, вы должны использовать другой символ (как разделитель) для замены. Например, альтернативные tr-части

 tr '"' '\n' 

или

 tr "'" '\n' 

если вы хотите заменить двойные или одинарные кавычки.

Если вам нужно посчитать WORD, но не prefixWORD, WORDsuffix или prefixWORDsuffix, вы можете заключить шаблон WORD в маркеры begin-end / end:

 grep -c '\<WORD\>' 

С GNU grep это работает: grep -o '\<WORD\>' | wc -l grep -o '\<WORD\>' | wc -l

-o печатает каждую согласованную часть каждой строки на отдельной строке.

\< утверждает начало слова и \> утверждает конец слова (аналогично Perl \b ), поэтому это гарантирует, что вы не соответствуете строке в середине слова.

Например,

 $ python -c 'import this' |  grep '\ <one \>'
 Должен быть один - и желательно только один - простой способ сделать это.
 Пространства имен - одна хорошая идея - давайте сделаем больше!
 $ python -c 'import this' |  grep -o '\ <one \>'
 один
 один
 один
 $ python -c 'import this' |  grep -o '\ <one \>' |  wc -l
 3

С последними версиями GNU coreutils ,

 grep -o -c WORD file 

должно сработать. (У более ранних версий была ошибка в этой комбинации опций.)

 sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'AZ' 'az' | sort | uniq -c | sort -nr | nl 

Эта команда делает следующее:

  1. Замените все не буквенно-цифровые символы пробелом.
  2. Все разрывы строк также преобразуются в пробелы.
  3. Сокращает все пробелы до одного пробела
  4. Все пробелы теперь преобразуются в разрывы строк. Каждое слово в строке.
  5. Переводит все слова в нижний регистр, чтобы избежать «Hello» и «hello» для разных слов.
  6. Сортировка текста
  7. Подсчитывает и удаляет равные строки
  8. Сортирует обратное, чтобы подсчитать наиболее часто используемые слова
  9. Добавьте номер строки к каждому слову, чтобы узнать слово posotion в целом

Например, если я хочу проанализировать первое сообщение Linus Torvald:

От: torvalds@klaava.Helsinki.FI (Линус Бенедикт Торвальдс) Группы новостей: comp.os.minix Тема: Что бы вы хотели видеть больше всего в minix? Краткое описание: небольшой опрос для моей новой операционной системы. Идентификационный номер сообщения: <1991Aug25.205708.9541@klaava.Helsinki.FI> Дата: 25 августа 91 20:57:08 GMT Организация: Университет Хельсинки

Привет всем, используя minix –

Я делаю (бесплатную) операционную систему (просто хобби, не будет большим и профессиональным, как gnu) для 386 (486) AT-клонов. Это началось с апреля и начинает готовиться. Мне бы хотелось получить любую обратную связь о том, что нравится / не нравится людям в minix, так как моя ОС несколько напоминает его (такой же физический макет файловой системы (по практическим соображениям)).

В настоящее время я портировал bash (1.08) и gcc (1.40), и все работает. Это означает, что через несколько месяцев я получу что-то практическое, и я хотел бы узнать, какие функции захотят большинство людей. Любые предложения приветствуются, но я не буду обещать, что я их реализую 🙂

Линус (torvalds@kruuna.helsinki.fi)

PS. Да – он свободен от любого кода minix, и он имеет многопоточную fs. Он НЕ protable (использует 386 переключения задач и т. Д.), И он, вероятно, никогда не поддержит ничего, кроме AT-harddisks, так как это все, что у меня есть :-(.

Я создаю файл с именем linus.txt , я вставляю содержимое, а затем пишу в консоли:

 sed -e 's/[^[:alpha:]]/ /g' linus.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'AZ' 'az' | sort | uniq -c | sort -nr | nl 

Вывод:

  1 7 i 2 5 to 3 5 like 4 5 it 5 5 and 6 4 minix 7 4 a 8 3 torvalds 9 3 of 10 3 helsinki 11 3 fi 12 3 any 13 2 would 14 2 won 15 2 what 16 ... 

Если вы хотите визуализировать только первые 20 слов:

 sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'AZ' 'az' | sort | uniq -c | sort -nr | nl | head -n 20 

Важно отметить, что команда tr 'AZ' 'a-z' еще не поддерживает UTF-8, так что на иностранных языках слово APRÈS будет переведено как aprÈs.

Если вы хотите найти только одно слово, вы можете добавить grep в конец:

 sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'AZ' 'az' | sort | uniq -c | sort -nr | nl | grep "\sword_to_search_for$" 

В скрипте под названием search_freq :

 #!/bin/bash sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'AZ' 'az' | sort | uniq -c | sort -nr | nl | grep "\s$1$" 

Сценарий должен быть вызван:

  search_freq word_to_search_for