Это задание, поэтому, пожалуйста, просто укажите мне правильное направление.
У меня куча файлов сообщений. Каждое сообщение адресовано кому-то, поэтому каждый файл будет содержать строку типа «Кому: Джону Смиту», «Кому: Джейн Доу» ....
Хочу посчитать, сколько файлов адресовано каждому человеку и распечатать
Я знаю, что мы можем подсчитать, сколько файлов содержат имя с
grep -lr "name" directoryPath | wc -l
Эта проблема:
Я не знаю, как найти каждого уникального получателя, прежде чем считать их сообщения.
Я думал, что могу создать временный файл для хранения имен и подсчета, чтобы я мог каждый раз проверять, новый ли получатель. Я уверен, что есть способ получше
Вы можете использовать grep, sort и uniq для выполнения этого упражнения. uniq может дать вам окончательный результат, если вы используете правильный флаг.
Мне кажется, вам нужно знать количество Сообщения на каждого получателя, а не количество файлов на каждого получателя. Поэтому вместо того, чтобы использовать каждый отдельный файл, я бы рекомендовал объединить файлы и сосредоточиться на количестве совпадающих строк To:.
@RuudHelderman Конкатенация не требуется, если вы используете grep "$To" directoryPath/* в качестве первого шага.
IMHO с To: [email protected]; [email protected]; [email protected] в файле, этот файл должен быть посчитан один раз как для a, так и для b, но это идеально. Поддержка этой ситуации менее тривиальна, чем просто сортировка и подсчет результатов grep. Вот почему примеры (как задал @Cyrus) так важны: когда все входные файлы имеют только одного адресата в строке To, решение намного проще.
@WalterA Конкатенация имеет значение при подсчете вхождений в нескольких файлах (чтобы избавиться от надоедливого префикса имени файла). Но вы правы; grep -h может сделать то же самое.





В полученных вами комментариях есть все, что вам нужно, чтобы ответить на это задание. Вот как их собрать:
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
Короче говоря, если вы заботитесь об изучении материала, поиграйте с различными параметрами и посмотрите, почему ответ работает.
Кстати, я не проверял свои ответы вам. Большинство плакатов представляют свои вопросы с тестовыми данными и примерами ожидаемых результатов. Затем плакаты могут подтвердить, что их решения правильно отвечают на вопрос. В этом случае я просто даю вам свое обоснованное предположение о том, что вам нужно.
Прочтите руководства для программ
sortиuniq. Подумайте, как они могут работать с результатами использования grep для извлечения адресных строк из всех файлов.