You need to enable JavaScript to run this app. 如何用Shell脚本提取CSV的Alias列无效邮箱记录至新文件并删除原文件对应记录
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 21:54:06