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


31

У меня есть текстовый файл, содержащий твиты, и я должен подсчитать, сколько раз слово упоминается в твите. Например, файл содержит:

Apple iPhone X is going to worth a fortune
The iPhone X is Apple's latest flagship iPhone. How will it pit against it's competitors?

И скажем, я хочу посчитать, сколько раз слово iPhone упоминается в файле. Итак, вот что я попробовал.

cut -f 1 Tweet_Data | grep -i "iPhone" | wc -l

это конечно работает, но я запутался насчет команды 'wc' в unix. Какая разница, если я попробую что-то вроде:

cut -f 1 Tweet_Data | grep -c "iPhone"

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


cut -f1резка на основе вкладок, что здесь мало что дает. Вы уверены, что wc -lэто действительно дает вам правильный счет? Здесь будет показано 2, но я считаю 3 экземпляра «айфона».
Джефф Шаллер


Ответы:


54

Учитывая такое требование, я бы использовал GNU grep (для -oопции ), а затем пропустил его, wcчтобы подсчитать общее количество вхождений:

$ grep -o -i iphone Tweet_Data | wc -l
3

Обычные grep -cданные подсчитывают количество совпадающих строк , а не общее количество совпадающих слов . Использование этой -oопции говорит grep выводить каждое совпадение на его линии, независимо от того, сколько раз совпадение находится в строке.

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


Если GNU grep недоступен (или не нужен), вы можете преобразовать ввод trтак, чтобы каждое слово находилось в отдельной строке, а затем используйте grep -cдля подсчета:

$ tr '[:space:]' '[\n*]' < Tweet_Data | grep -i -c iphone
3

1

Самый простой метод,

grep -wc "your_text" FileName

для тебя это будет,

grep -wc "iPhone" Tweet_Data

Очень четкий ответ, однако, если вы подходите к слову типа «круто», вы будете соответствовать только «круто», а не «круто», поэтому имейте в виду, что пробелы вокруг слова имеют значение
Джейсон Леонард

1
Результат будет неверным, если слово встречается в строке более одного раза.
hek2mgl
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.