首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对所有具有相同字段内容的行执行命令。

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

Unix & Linux用户
提问于 2021-05-07 10:01:12
回答 3查看 79关注 0票数 0

我有一个学生csv文件,其中包含学生数据和最后负责老师的邮件。我试着只自动发送一封电子邮件给老师,其中包含他所有的学生(使用sendemail)。邮件部分没有问题,但我不能从csv中获取数据,它们是我想要的。csv文件每天创建,每天包含不同数量的学生。

代码语言:javascript
复制
aer,kdx,mail1
dke,kad,mail2
err,qqq,mail1
qpi,bcc,mail1
bkd,onk,mail2
kcc,mnb,mail3

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

在本例中,它应该发送3封邮件。第一含

代码语言:javascript
复制
aer,kdx
err,qqq
qpi,bcc

第二次包含

代码语言:javascript
复制
dke,kad
bkd,onk

第三次含

代码语言:javascript
复制
kcc,mnb

谢谢你的暗示

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2021-05-07 10:14:40

您可以使用awk创建3个文件,其内容分别为$1$2,文件名从$3派生出来:

使用GNU awk

代码语言:javascript
复制
awk 'BEGIN{OFS=FS=","}{print $1,$2 > $3"_out.csv"}' student.csv

标准awk

代码语言:javascript
复制
awk 'BEGIN{OFS=FS=","}{out=$2"_out.csv"; print $1,$2 >> out; close(out)}' student.csv

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

代码语言:javascript
复制
for m in *_out.csv; do
    _mail_command_
done
票数 0
EN

Unix & Linux用户

发布于 2021-05-07 11:00:24

我会这样做:

代码语言:javascript
复制
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
票数 1
EN

Unix & Linux用户

发布于 2021-05-09 12:57:36

命令

代码语言:javascript
复制
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

测试和工作良好

代码语言:javascript
复制
First we collecting unique email id and Fetching students who belongs to that email id and saving in file and sending email
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/648588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档