it-swarm-ru.tech

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

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

45
mythz
$ 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'

если вы хотите заменить двойные или одинарные кавычки. Конечно, вы также можете использовать tr для одновременной замены нескольких символов (например, пробелы и знаки препинания).

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

grep -c '^Word$'

Что эквивалентно маркерам Word-begin/End в нашем контексте:

grep -c '\<Word\>'
48
maxschlepzig

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

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

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

Например,

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

К сожалению это не работает с GNU coreutils.

grep -o -c Word file

Если он работает на вашей платформе, это элегантное и довольно интуитивное решение; но GNU люди все еще думают.

11
tripleee
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl 

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

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

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

От: [email protected] (Линус Бенедикт Торвальдс) Группы новостей: comp.os.minix Тема: Что бы вы хотели увидеть больше всего в minix? Резюме: небольшой опрос для моей новой операционной системы. Идентификатор сообщения: <[email protected]> Дата: 25 августа, 91 20:57:08 GMT Организация: Университет Хельсинки

Привет всем, кто использует Minix -

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

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

Линус ([email protected])

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

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

sed -e 's/[^[:alpha:]]/ /g' linus.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | 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 'A-Z' 'a-z' | 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 'A-Z' 'a-z' | 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 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | grep "\s$1$"

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

 search_freq Word_to_search_for
7
Roger Borrell

В зависимости от того, хотите ли вы сопоставить Word в ключах или в значениях данных JSON, вы, вероятно, захотите извлечь из данных только ключи или только значения. В противном случае вы можете посчитать некоторые слова слишком много раз, если они встречаются как ключи и значения.

Чтобы извлечь все ключи:

jq -r '..|objects|keys[]' <file.json

Это рекурсивно проверяет, является ли текущая вещь объектом, и, если это так, извлекает ключи. Выводом будет список ключей, по одному на строку.

Чтобы извлечь все значения:

jq -r '..|scalars' <file.json

Это работает аналогичным образом, но имеет меньше шагов.

Затем вы можете передать вывод выше через grep -c 'PATTERN' (для сопоставления некоторого шаблона с ключами или значениями) или grep -c -w -F 'Word' (чтобы соответствовать Word в ключах или значениях) или grep -c -x -F 'Word' (чтобы соответствовать полный ключ или значение), или аналогичный, чтобы сделать ваш подсчет.

3
Kusalananda

У меня есть JSON с чем-то вроде этого: "number":"OK","number":OK" повторяется несколько раз в одной строке.

Мой простой счетчик "ОК":

sed "s|,|\n|g" response | grep -c OK

0
khazad-dum_miner

С помощью grep -c Вы будете считать только строки, одна строка может иметь много вхождений Слова.

Это сделало бы это:

grep -o Word foo|wc -l
0
Ramiro Velazquez