Подсчитайте, сколько файлов содержат строку

Это задание, поэтому, пожалуйста, просто укажите мне правильное направление.

У меня куча файлов сообщений. Каждое сообщение адресовано кому-то, поэтому каждый файл будет содержать строку типа «Кому: Джону Смиту», «Кому: Джейн Доу» ....

Хочу посчитать, сколько файлов адресовано каждому человеку и распечатать

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

grep -lr "name" directoryPath | wc -l

Эта проблема:

Я не знаю, как найти каждого уникального получателя, прежде чем считать их сообщения.

Я думал, что могу создать временный файл для хранения имен и подсчета, чтобы я мог каждый раз проверять, новый ли получатель. Я уверен, что есть способ получше

Прочтите руководства для программ sort и uniq. Подумайте, как они могут работать с результатами использования grep для извлечения адресных строк из всех файлов.

Shawn 04.11.2018 10:46

Вы можете использовать grep, sort и uniq для выполнения этого упражнения. uniq может дать вам окончательный результат, если вы используете правильный флаг.

perreal 04.11.2018 10:48

Мне кажется, вам нужно знать количество Сообщения на каждого получателя, а не количество файлов на каждого получателя. Поэтому вместо того, чтобы использовать каждый отдельный файл, я бы рекомендовал объединить файлы и сосредоточиться на количестве совпадающих строк To:.

Ruud Helderman 04.11.2018 10:49

@RuudHelderman Конкатенация не требуется, если вы используете grep "$To" directoryPath/* в качестве первого шага.

Walter A 04.11.2018 14:51

IMHO с To: [email protected]; [email protected]; [email protected] в файле, этот файл должен быть посчитан один раз как для a, так и для b, но это идеально. Поддержка этой ситуации менее тривиальна, чем просто сортировка и подсчет результатов grep. Вот почему примеры (как задал @Cyrus) так важны: когда все входные файлы имеют только одного адресата в строке To, решение намного проще.

Walter A 04.11.2018 14:59

@WalterA Конкатенация имеет значение при подсчете вхождений в нескольких файлах (чтобы избавиться от надоедливого префикса имени файла). Но вы правы; grep -h может сделать то же самое.

Ruud Helderman 04.11.2018 15:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В полученных вами комментариях есть все, что вам нужно, чтобы ответить на это задание. Вот как их собрать:

grep -hr To: directoryPath | sort  | uniq -c 

Grep будет искать во всех файлах в каталоге directoryPath и ниже строки, содержащие «Кому:», и отображать их. -R указывает grep рекурсивно искать все каталоги, а -h подавляет имена файлов в выводе grep.

Мы должны использовать sort, чтобы объединить все одинаковые имена. Это настраивает вывод для подсчета с помощью uniq -c (что требует сортировки ввода для достижения ваших требований).

Попробуйте выполнить приведенную выше команду без каналов, чтобы понять, что это за результат. Например, попробуйте следующее:

grep -r To: directoryPath

И сравните это с этим:

grep -hr To: directoryPath

Затем попробуйте посмотреть, что происходит с uniq -c без сортировки:

grep -hr To: directoryPath | uniq -c

Или попробуйте уникальную функцию сортировки и посмотрите, как это повлияет на результаты:

grep -hr To: directoryPath | sort  -u

Короче говоря, если вы заботитесь об изучении материала, поиграйте с различными параметрами и посмотрите, почему ответ работает.

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

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