У меня есть большой файл JSON, который находится в одной строке, и я хочу использовать командную строку, чтобы иметь возможность подсчитать количество вхождений слова в файле. Как я могу это сделать?
bash
command-line
grep
json
mythz
источник
источник
{ "key": "the key" }
следует ли считать строкуkey
один или два раза.Ответы:
Где
tr
заменяет пробелы символами новой строки,grep
фильтрует все результирующие строки, соответствующие WORD, иwc
подсчитывает оставшиеся.Можно даже сохранить
wc
деталь, используя-c
опцию grep:-c
Вариант определяется POSIX.Если не гарантировано, что между словами есть пробелы, вы должны использовать какой-либо другой символ (как разделитель) для замены. Например, альтернативные
tr
частиили
если вы хотите заменить двойные или одинарные кавычки. Конечно, вы также можете использовать
tr
для замены нескольких символов одновременно (подумайте о различных видах пробелов и знаков пунктуации).Если вам нужно посчитать WORD, но не префикс WORD, WORDsuffix или prefixWORDsuffix, вы можете заключить шаблон WORD в маркеры начала / конца строки:
Что эквивалентно маркерам начала / конца слова в нашем контексте:
источник
tr
команду, которая выполняет эту работу, вместо того, чтобы предлагать примеры, которые никогда не будут работать во всех ситуациях. Он также будет соответствовать словам, которые содержат слово, которое вы ищете.grep -o '\<WORD\>' | wc -l
Решение гораздо выше.С GNU grep это работает:
grep -o '\<WORD\>' | wc -l
-o
печатает каждую совпавшую часть каждой строки на отдельной строке.\<
устанавливает начало слова и\>
устанавливает конец слова (аналогично Perl\b
), так что это гарантирует, что вы не соответствуете строке в середине слова.Например,
источник
grep -wo WORD | wc -l
Это, к сожалению , не работает с GNU
coreutils
.Если он работает на вашей платформе, это элегантное и довольно интуитивное решение; но люди GNU все еще думают.
источник
grep
есть ошибка. Из POSIX не ясно, какая семантика объединения-c
и-o
должна быть, так что в настоящее время она не переносима. Спасибо за комментарий; Я обновил этот ответ.Эта команда делает следующее:
Например, если я хочу проанализировать первое сообщение Линуса Торвальда:
Я создаю файл с именем linus.txt , вставляю содержимое и затем пишу в консоли:
Выход будет:
Если вы хотите визуализировать только первые 20 слов:
Важно отметить , что команда тр «AZ» «а-г» не зоныСкидки UTF-8 пока , так что на иностранных языках слово Apres бы перевести как Apres.
Если вы хотите искать только одно слово, вы можете добавить в конце команду grep:
В скрипте с именем search_freq :
Сценарий должен называться:
источник
sed: -e expression #2, char 7: unterminated
s 'command`, это также подсчитывает все слова, верно? Но ОП задал только конкретный. Также немного объяснений было бы неплохо.В зависимости от того, хотите ли вы сопоставить слово в ключах или в значениях данных JSON, вы, вероятно, захотите извлечь из данных только ключи или только значения. В противном случае вы можете посчитать некоторые слова слишком много раз, если они встречаются как ключи и значения.
Чтобы извлечь все ключи:
Это рекурсивно проверяет, является ли текущая вещь объектом, и, если это так, извлекает ключи. Выводом будет список ключей, по одному на строку.
Чтобы извлечь все значения:
Это работает аналогичным образом, но имеет меньше шагов.
Затем вы можете перенаправить вывод вышеприведенного через
grep -c 'PATTERN'
(для сопоставления некоторого шаблона с ключами или значениями), илиgrep -c -w -F 'WORD'
(для сопоставления слова в ключах или значениях), илиgrep -c -x -F 'WORD'
(для сопоставления полного ключа или значения) или подобного, чтобы сделай свой подсчетисточник
У меня есть JSON с чем-то вроде этого:
"number":"OK","number":OK"
повторяется несколько раз в одной строке.Мой простой счетчик "ОК":
sed "s|,|\n|g" response | grep -c OK
источник
Я использовал ниже команду awk, чтобы найти количество вхождений
файл примера
кошка file1
команда:
выход
источник
awk '{sum+=gsub("praveen","")} END {print sum+0}'
.