如何用Shell脚本提取CSV的Alias列无效邮箱记录至新文件并删除原文件对应记录
Shell 实现CSV指定字段邮箱格式校验与记录拆分
核心逻辑
- 自动识别CSV表头的目标校验列,不硬编码列位置,列顺序变动也能正常适配
- 操作前自动生成原文件备份,避免误处理导致数据丢失
- 逐行遍历数据,按邮箱格式规则分流:合法记录保留到原文件,格式不合法的记录单独写入新CSV
- 邮箱校验规则兼容常规企业邮箱格式,可精准识别示例中“带空格的非邮箱值”这类错误
可直接复用的脚本
#!/bin/bash # 基础配置 TARGET_CSV="original.csv" # 待处理的原CSV路径 CHECK_TARGET_COL="alias" # 需要校验的字段名 INVALID_OUTPUT="invalid_records.csv" # 无效记录输出文件路径 BACKUP_SUFFIX=".bak" # 备份原文件 cp "$TARGET_CSV" "${TARGET_CSV}${BACKUP_SUFFIX}" # 解析表头,定位目标字段的列序号 table_header=$(head -n1 "$TARGET_CSV") col_index=$(echo "$table_header" | awk -F',' -v target="$CHECK_TARGET_COL" '{ for(i=1;i<=NF;i++){ # 清理表头前后的空白字符 gsub(/^[[:space:]]+|[[:space:]]+$/, "", $i) # 大小写不敏感匹配目标字段名 if(tolower($i) == tolower(target)){ print i exit } } }') # 校验目标列是否存在 if [ -z "$col_index" ]; then echo "报错:CSV表头中未找到 $CHECK_TARGET_COL 字段" exit 1 fi # 初始化两个输出文件,写入统一表头 head -n1 "$TARGET_CSV" > "$INVALID_OUTPUT" head -n1 "$TARGET_CSV" > "${TARGET_CSV}.tmp" # 逐行遍历数据行做校验 tail -n +2 "$TARGET_CSV" | while IFS=, read -r row_content; do # 提取目标字段值,清理前后空白 target_val=$(echo "$row_content" | cut -d',' -f$col_index | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') # 邮箱格式校验规则 if echo "$target_val" | grep -qE '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'; then echo "$row_content" >> "${TARGET_CSV}.tmp" else echo "$row_content" >> "$INVALID_OUTPUT" fi done # 临时文件替换原文件,完成处理 mv "${TARGET_CSV}.tmp" "$TARGET_CSV"
实际运行效果
针对给出的示例CSV内容:
- 处理完成后原CSV会只保留2条合法记录(id=1、id=2的数据行)
- 生成的
invalid_records.csv会包含2条无效记录(id=3、id=4的行),对应alias字段值带空格、不符合邮箱格式的问题 - 同目录下会自动生成
original.csv.bak备份文件,处理失误时可直接从备份恢复原始数据
注意:脚本适配逗号分隔的标准简单CSV,如果你的CSV存在字段内带逗号、被双引号包裹的复杂场景,需要替换处理逻辑为awk实现更严谨的CSV解析。
内容的提问来源于stack exchange,提问作者user313150
相关产品推荐
相关产品推荐

