对具有相同字段内容的所有行执行命令

对具有相同字段内容的所有行执行命令

我有一个学生 csv 文件,其中包含带有学生数据的字段以及最后负责老师的邮件地址。我尝试仅自动向包含其所有学生的老师发送一封电子邮件(使用 sendemail)。邮件部分没问题,但我无法按照我想要的方式从 csv 中获取数据。 csv 文件每天创建,并且每天包含不同数量的学生。

aer,kdx,mail1
dke,kad,mail2
err,qqq,mail1
qpi,bcc,mail1
bkd,onk,mail2
kcc,mnb,mail3

我尝试使用 awk 并将包含相同邮件地址的所有行放入一个数组中,但这种方法失败了。

在此示例中,它应该发送 3 封邮件。第一个含有

aer,kdx
err,qqq
qpi,bcc

第二个含有

dke,kad
bkd,onk

第三包含

kcc,mnb

感谢您的任何提示

答案1

我会这样做:

sort -t, -k3,3 student.csv |
awk '
    BEGIN { FS=OFS="," }
    $3 != prev {
        close(out)
        out = $3 FS "out.csv"
        prev = $3
    }
    { print $1, $2 > out }
' ||
exit 1

for file in *,out.csv; do
    email="${file%,*}"
    send email to "$email" containing "$file"
done

答案2

您可以用来awk创建 3 个文件,其内容$1$2文件名源自$3

使用 GNU awk

awk 'BEGIN{OFS=FS=","}{print $1,$2 > $3"_out.csv"}' student.csv

标准awk

awk 'BEGIN{OFS=FS=","}{out=$2"_out.csv"; print $1,$2 >> out; close(out)}' student.csv

然后循环这些文件并发送您的电子邮件:

for m in *_out.csv; do
    _mail_command_
done

答案3

命令

for i in `awk -F "," '{if(!seen[$3]++)print $3}' filename`; do awk -F "," -v  i="$i" '$NF == i{print $1","$2}' filename >$i.csv; mailx -s "suject " -a "$i".csv $i</dev/null;done

测试并运行良好

First we collecting unique email id and Fetching students who belongs to that email id and saving in file and sending email

相关内容