Bash CSV处理脚本问题:重复邮箱未统一追加location_id
修正Bash CSV解析脚本的重复邮箱处理问题
问题说明
当前CSV处理脚本在生成邮箱时,仅修改了第二个重复邮箱地址(追加对应location_id),第一个重复项未做处理,需要调整逻辑让所有重复邮箱都追加各自的location_id。
原始CSV内容
id,location_id,name,title,email,department 1,1,Susan houston,Director of Services,, 2,1,Christina Gonzalez,Director,, 3,2,Brenda brown,"Director, Second Career Services",, 4,3,Howard Lader,"Manager, Senior Counseling",, 5,4,Kimberly Pesavento,Commercial director,, 6,5,Joe Bloom,Financial Empowerment Programs Program Director,, 7,6,peter Olson,Director,, 8,6,Bart charlow,Executive Director,, 9,7,Bart Charlow,Executive Director,,
当前脚本
#!/bin/bash #create path to redirect accounts.csv to same directory as accounts_new.csv path=$(dirname $1) # Substituted commmas with vertical lines, so sed command works awk -F'"' -v OFS='"' '{ for (i=2; i<=NF; i+=2) gsub(",", "|", $i) } 1' accounts.csv | # Changed first letters of names to uppercase awk -F, -v col=3 ' NR > 1{ n=split(tolower($col),a," ") $col=toupper(substr(a[1],1,1)) substr(a[1],2) for(i=2;i<=n;i++) { $col=$col " " toupper(substr(a[i],1,1)) substr(a[i],2) } }1' OFS="," | # Generated email addresses sed -E 's/([^,]*,([^,]*),) ?(([[:alpha:]])[^ ]* +)(([^,]*),[^,]*,)[^,]*/\1\u\3\u\5\L\4\6\@abc.com/' | awk -F, '{for (i=5;i<=5;i++){if (v[i,$i]++){b[$i]=$i; $i=split($3,arr," ") val=(substr($3,1,1) arr[2]$2"@abc.com") $5=tolower(val) }};print $0}' OFS="," | # Added missing commas and sent output to new file sed -E 's/|/\,/g' > $path"/accounts_new.csv"
当前输出
id,location_id,name,title,email,department 1,1,Susan Houston,Director of Services,shouston@abc.com, 2,1,Christina Gonzalez,Director,cgonzalez@abc.com, 3,2,Brenda Brown,Director, Second Career Services,bbrown@abc.com, 4,3,Howard Lader,Manager, Senior Counseling,hlader@abc.com, 5,4,Kimberly Pesavento,Commercial director,kpesavento@abc.com, 6,5,Joe Bloom,Financial Empowerment Programs Program Director,jbloom@abc.com, 7,6,Peter Olson,Director,polson@abc.com, 8,6,Bart Charlow,Executive Director,bcharlow@abc.com, 9,7,Bart Charlow,Executive Director,bcharlow7@abc.com,
期望输出
id,location_id,name,title,email,department 1,1,Susan Houston,Director of Services,shouston@abc.com, 2,1,Christina Gonzalez,Director,cgonzalez@abc.com, 3,2,Brenda Brown,Director, Second Career Services,bbrown@abc.com, 4,3,Howard Lader,Manager, Senior Counseling,hlader@abc.com, 5,4,Kimberly Pesavento,Commercial director,kpesavento@abc.com, 6,5,Joe Bloom,Financial Empowerment Programs Program Director,jbloom@abc.com, 7,6,Peter Olson,Director,polson@abc.com, 8,6,Bart Charlow,Executive Director,bcharlow6@abc.com, 9,7,Bart Charlow,Executive Director,bcharlow7@abc.com,
修正方案
问题出在处理重复邮箱的awk段,原逻辑仅在第二次遇到重复邮箱时才修改地址,第一次不会处理。我们需要先统计所有邮箱的出现次数,再统一处理所有重复项:
完整修正后的脚本
#!/bin/bash #create path to redirect accounts.csv to same directory as accounts_new.csv path=$(dirname $1) # Substituted commmas with vertical lines, so sed command works awk -F'"' -v OFS='"' '{ for (i=2; i<=NF; i+=2) gsub(",", "|", $i) } 1' accounts.csv | # Changed first letters of names to uppercase awk -F, -v col=3 ' NR > 1{ n=split(tolower($col),a," ") $col=toupper(substr(a[1],1,1)) substr(a[1],2) for(i=2;i<=n;i++) { $col=$col " " toupper(substr(a[i],1,1)) substr(a[i],2) } }1' OFS="," | # Generated email addresses sed -E 's/([^,]*,([^,]*),) ?(([[:alpha:]])[^ ]* +)(([^,]*),[^,]*,)[^,]*/\1\u\3\u\5\L\4\6\@abc.com/' | # 修正后的重复邮箱处理逻辑 awk -F, ' # 第一次遍历:统计每个邮箱的出现次数 NR == FNR { if (NR > 1) { email_count[$5]++ } next } # 第二次遍历:处理每一行 { if (NR > 1 && email_count[$5] > 1) { split($3, arr, " ") $5 = tolower(substr($3, 1, 1) arr[2] $2 "@abc.com") } print $0 }' OFS="," - - | # Added missing commas and sent output to new file sed -E 's/|/\,/g' > $path"/accounts_new.csv"
修正逻辑说明
- 第一次遍历所有行,统计每个邮箱地址的出现次数,存储在
email_count数组中 - 第二次遍历每一行时,判断当前邮箱的出现次数是否大于1:
- 若是,则生成包含对应
location_id的邮箱地址 - 若否,保持原邮箱地址不变
- 若是,则生成包含对应
这样所有重复的邮箱都会被修改为带对应location_id的格式,符合期望输出。
内容的提问来源于stack exchange,提问作者Narek Arakelyan
相关产品推荐
相关产品推荐

