同じフィールド内容を含むすべての行でコマンドを実行する

同じフィールド内容を含むすべての行でコマンドを実行する

学生データを含むフィールドと最後の担当教師のEメールアドレスを含む学生CSVファイルがあります。私はすべての学生と一緒に教師に自動的に電子メールを送信しようとします(sendemailを使用)。メール部分は大丈夫ですが、好きな方法でCSVからデータを取得することはできません。 csvファイルは毎日作成され、毎日異なる数の学生が含まれています。

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

awkを使用して同じ電子メールアドレスを含むすべての行を配列に入れようとしましたが、失敗しました。

この例では、3つのEメールを送信する必要があります。最初の内容は

aer,kdx
err,qqq
qpi,bcc

2番目には次のものがあります。

dke,kad
bkd,onk

3番目には以下が含まれます。

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

関連情報