Подсчет ненужных слов (unix) с помощью grep

Я пытаюсь подсчитать, сколько раз слово огонь и вода появляется в последнем слове каждой строки

$cat file 
red,Fire
blue,water 
Fire red, Fire

Мое решение:

$grep -Ewo "Fire" <file> | sort | uniq -c

вывод, который я получаю:

$Fire 3
$Water 1

Я ожидал получить:

$Fire 2
$Water 1 

Это («Огонь 3», «Вода 1») не является результатом, который я получаю, когда запускаю эту команду. Слово «Огонь» напечатано трижды на трех отдельных строках. Не могли бы вы опубликовать полный сеанс оболочки, показывающий, что вы получаете и чего ожидаете от каждой конкретной команды?

Rob Bricheno 31.10.2018 14:35

На самом деле я использовал grep -Ewo "Fire" <файл> | сортировать | uniq -c. Плохо, что сейчас обновлю.

Pineappleking 31.10.2018 14:38
2
2
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Шаблон, который вы передаете grep, не соответствует вашим требованиям. Fire просто означает эти буквы в указанном порядке в любом месте строки.

Вы включаете опцию -w, которая ограничивает его отображение как отдельное слово, но это все равно может быть где угодно в строке. Из man grep в моей системе:

-w, --word-regexp
Select only those lines containing matches that form whole words. The test is that the matching substring must either be at the beginning of the line, or preceded by a non-word constituent character. Similarly, it must be either at the end of the line or followed by a non-word constituent character. Word-constituent characters are letters, digits, and the underscore.

Обычно каждая строка либо повторяется в выводе, либо скрывается, но вы включаете опцию -o. Из man grep в моей системе:

-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.

Обратите внимание, в частности, на последнее предложение: если несколько частей строки совпадают, все они будут выведены как отдельные строки вывода.

Сравнивать:

# Match all three words, and output the line if it matches
$ echo 'one two three' | grep -E 'one|two|three'
one two three

# Match all three words, and output the matching parts
$ echo 'one two three' | grep -Eo 'one|two|three'
one
two
three

Итак, ваша команда сообщает вам, что слово «огонь» появляется всего три раза, игнорируя место в строке или сколько раз в каждой строке.

Чтобы ограничить его только соответствием в конце строки, добавьте $ в свое выражение:

grep -Ewo 'Fire$'

Большое спасибо, это действительно помогло!

Pineappleking 31.10.2018 15:01

Другие вопросы по теме