Вы хотите посчитать количество раз или количество строк, в которых появились вишни?
awk -F, '$0~k{s=s (s?", ":x) $(NF-1); t+=gsub(k,x)}
END{printf "food: %s\n%s appeared %d/%d times\n", s, k, t, NR}
' k=cherries file
или
awk -F, '$0~k{s=s (s?", ":x) $(NF-1); t++}
END{printf "food: %s\n%s appeared in %d/%d lines\n", s, k, t, NR}
' k=cherries file
В комментариях вы говорите, что file
идентифицирует текстовый файл как текстовый файл ASCII с окончаниями строки CRLF. Это еще один способ сказать, что это текстовый файл DOS, возможно, созданный с помощью редактора в системе Windows.
Текстовый файл DOS имеет, по сравнению с текстовым файлом Unix, дополнительный символ возврата каретки в конце каждой строки перед новой строкой. Вот почему ваше регулярное выражение не соответствует, на самом деле ни одна строка не заканчивается на me
, они заканчиваются на me\r
, где \r
— это распространенный способ написания символа возврата каретки.
Решением этой проблемы является преобразование вашего текстового файла в текстовый файл Unix с использованием, например,. инструмент преобразования dos2unix
перед его использованием в системе Unix.
Само по себе grep "me$"
определенно верно. Я подозреваю, что ваши строки заканчиваются несколькими дополнительными символами, которые трудно увидеть, такими как табуляция и пробелы.
Попробуйте один из этих:
# \t means tab
# [\t ] means a tab or a space
# [\t ]* means any number (including zero) of tabs and spaces.
#
grep "me[\t ]*$" sm.txt
или:
# [[:space:]] means any white space. I don't know if there are
# more than just space and tabs. This works with GNU grep only.
#
grep "me[[:space:]]*$" sm.txt