동일한 필드 내용을 포함하는 모든 줄에서 명령 실행

동일한 필드 내용을 포함하는 모든 줄에서 명령 실행

학생 데이터가 포함된 필드와 마지막 담당 교사의 이메일 주소가 포함된 학생 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이를 사용 하여 내용 $1$2파일 이름이 다음에서 파생된 3개의 파일을 만들 수 있습니다 $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

관련 정보