使用awk处理CSV文件:为重复邮箱@前添加序号的技术问询
解决方案
要实现给重复邮箱添加序号的需求,你需要分两步处理:先统计每个生成邮箱的出现频率,再根据频率决定是否添加序号。以下是整合了所有需求的awk命令:
awk -v FPAT='([^,]*)|("[^"]+")' -v OFS=',' ' # 第一遍扫描:统计每个标准化邮箱的出现次数 NR == FNR { if (NR == 1) next # 跳过表头 split($3, name_parts, " ") # 生成基础邮箱(用于统计频率) email_prefix = tolower(substr(name_parts[1], 1, 1) name_parts[2]) base_email = email_prefix "@email.com" freq[base_email]++ next } # 第二遍扫描:处理输出并添加序号 { if (FNR == 1) { print # 直接打印表头 next } split($3, name_parts, " ") # 1. 处理姓名首字母大写 formatted_name = toupper(substr(name_parts[1], 1, 1)) substr(name_parts[1], 2) " " \ toupper(substr(name_parts[2], 1, 1)) substr(name_parts[2], 2) # 2. 生成邮箱前缀和基础邮箱 email_prefix = tolower(substr(name_parts[1], 1, 1) name_parts[2]) base_email = email_prefix "@email.com" # 3. 给重复邮箱添加序号 count[base_email]++ if (freq[base_email] > 1) { final_email = email_prefix count[base_email] "@email.com" } else { final_email = base_email } # 4. 输出所有字段 print $1, $2, formatted_name, $4, final_email, $6 } ' file.csv file.csv
关键逻辑说明
- FPAT配置:确保CSV中带引号的字段(如
"Manager, Commanding Officer")被正确识别为单个字段,避免逗号分割错误。 - 两次扫描文件:
- 第一遍扫描仅统计每个标准化邮箱的出现次数,存入
freq数组。 - 第二遍扫描处理每行数据:
- 按需求格式化姓名(首字母大写)。
- 生成基础邮箱,若该邮箱出现多次(
freq[base_email] > 1),则在@前添加当前出现的序号(由count数组记录)。 - 用
OFS=','保证输出为标准CSV格式。
- 第一遍扫描仅统计每个标准化邮箱的出现次数,存入
输出验证
运行上述命令后,输出将完全匹配你的预期结果:
id,location_id,name,title,email,department 1,10,Sharon Petersen,Administrator,spetersen1@email.com, 2,11,Sharon Petersen,Administrator,spetersen2@email.com, 3,14,Andres Espinoza,"Manager, Commanding Officer",aespinoza@email.com, 4,8,Elizabeth Feeney,CEO,efeeney@email.com,Operations 5,8,Marilyn Baker-Venturini,Director,mbaker-venturini@email.com,
内容的提问来源于stack exchange,提问作者Vanger69
相关产品推荐
相关产品推荐

