Сценарий оболочки -Как группировать записи тестового файла на основе значения столбца и отправлять электронную почту соответствующим получателям. - PullRequest
0 голосов
/ 22 января 2019

У меня есть CSV-файл, разделенный запятыми, с именем «file1», с указанными ниже деталями и заголовками: номер инцидента, дата, имя человека и идентификатор электронной почты. Требуется сгруппировать записи по имени и отправить электронное письмо со списком всех записей по его имени.

Так что в этом примере Сэм, Мутту, Эндрю, Джордан получат по одному письму каждое, и в этом письме они увидят все записи на свое имя.

10011,5-Ян, Сэм, Сэм @ companydomain.com

10023,8-Jan, Mutthu, Mutthu @ companydomain.com

10010,8-Jan, Mutthu, Mutthu @ companydomain.com

10026,15-Ян, Сэм, Сэм @ companydomain.com

10050,10-Ян, Иордания, Иордания @ companydomain.com

10021,12-Ян, Андрей, Андрей @ companydomain.com

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

    awk -F\, '{print>$3}' file1

Говоря о нашем существующем сценарии, он отправляет электронное письмо одно за другим, используя приведенную ниже команду, поэтому отправляет несколько писем Мутту и Сэму, которые нам не нужны.

    /usr/sbin/sendmail -v $MAILTO $MAILCC |grep Sent >> "$HOME/maillog.txt"

Любая помощь будет оценена

Спасибо Шаня

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Поскольку вопрос помечен как "bash", здесь возможное решение в виде чистого сценария оболочки.Обратите внимание, что это не было проверено.

#!/bin/bash

MAILCC=x@y.com

in_file="file1"

# 1. grep all lines containing a '@' (contained in email address)
# 2. Cut field 4 (the email address)
# 3. sort uniq (remove duplicate email addresses)
#
# Loop over that list
#
for email in $(grep '@' $in_file | cut -d, -f 4 | sort -u); do
    # only if $email is a non-empty string
    if [ -n "$email" ]; then
        # grep for email in source file and mail found lines
        {
            echo "From: sender@example.net"
            echo "To: $email"
            echo "Subject: Your test file records"
            echo ""
            grep "$email"  $in_file | while read -r line; do
               echo "$line"
           done
        } | /usr/sbin/sendmail -v $email $MAILCC
    fi
done | grep Send >>"$HOME/maillog.txt"
0 голосов
/ 22 января 2019

Вот скрипт Awk, который делает то, что вы запрашиваете.Мы собираем входные данные в массив, где каждый элемент содержит строки для одного получателя, а ключом является адрес электронной почты получателя ($4).Наконец мы перебираем ключи и отправляем по одному сообщению.

awk -F , '{ a[$4] = a[$4] ORS $0 }
    END {
        for (user in a) {
            cmd = "/usr/sbin/sendmail -v " $4
            print "From: sender@example.net" | cmd
            print "To: " $4 | cmd
            print "Subject: stuff from CSV" | cmd
            # Neck between headers and email body
            print "" | cmd
            # Skip initial ORS
            print substr(a[user],2) | cmd
            close(cmd) } }' file.csv |
grep Sent >>"$HOME/maillog.txt"

Я не могу догадаться, что в MAILCC, поэтому я просто оставил это.Если вы всегда хотите, чтобы Cc: статический адрес, добавить его обратно должно быть легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...