Shell脚本验证CSV文件retailer列唯一值有效性的问询
Shell实现Retailer列有效值校验(复刻R语言逻辑)
我明白你想要的是在Shell环境里复刻R语言那种「提取唯一值并筛选出不在预定义有效值列表里的无效项」的逻辑,还要加上日志记录、终止流程和用户通知的操作。之前用grep踩坑了对吧?咱们一步步来实现这个需求:
1. 需求拆解
- 预定义有效值:
ALB/SFY Total Ecom TA、Peapod Total Ecom TA、Target Total Ecom TA - 从
vendor.csv的第一列(retailer列)提取唯一值 - 识别不在有效值列表内的无效值
- 触发异常处理:记录日志、终止流程、通知用户
2. 完整Shell实现脚本
以下是封装好的脚本,每一步都加了注释说明:
#!/bin/bash # 定义核心参数与常量 INPUT_FILE="vendor.csv" # 把有效值存入数组,方便后续匹配 VALID_RETAILERS=("ALB/SFY Total Ecom TA" "Peapod Total Ecom TA" "Target Total Ecom TA") LOG_FILE="retailer_validation.log" # 第一步:提取第一列的唯一值(如果文件有表头,需加|tail -n +2跳过第一行) UNIQUE_RETAILERS=$(cut -d, -f1 "$INPUT_FILE" | sort -u) # 第二步:遍历唯一值,筛选出无效项 INVALID_RETAILERS=() for retailer in $UNIQUE_RETAILERS; do # 用数组包含匹配的方式,避免grep处理特殊字符(如/)的转义问题 if ! [[ " ${VALID_RETAILERS[@]} " =~ " $retailer " ]]; then INVALID_RETAILERS+=("$retailer") fi done # 第三步:异常处理逻辑 if [ ${#INVALID_RETAILERS[@]} -gt 0 ]; then # 记录带时间戳的日志 echo "$(date '+%Y-%m-%d %H:%M:%S') - 检测到无效Retailer值: ${INVALID_RETAILERS[*]}" >> "$LOG_FILE" # 控制台通知用户(可替换为邮件、Slack等通知方式) echo "⚠️ 错误:检测到无效的Retailer值,请查看日志文件$LOG_FILE:${INVALID_RETAILERS[*]}" # 终止流程并返回非0退出码,便于后续流程判断 exit 1 else echo "✅ 所有Retailer值均为有效值,继续后续处理..." # 这里写入正常处理的业务逻辑 fi
3. 关键细节说明
- 为什么不用
grep? 你的有效值包含斜杠(/)和空格,直接用grep需要额外转义特殊字符,批量匹配多个值也容易出错;用数组循环匹配更直观,还能避免部分匹配的问题(比如不会把"ALB"误判为"ALB/SFY Total Ecom TA")。 - 表头处理:如果
vendor.csv第一行是表头(比如retailer),记得在cut命令后追加| tail -n +2,跳过表头行避免误判。 - 通知扩展:控制台通知只是基础方案,你可以替换成邮件通知(比如
mail -s "Retailer校验失败" your@email.com < $LOG_FILE)或者团队协作工具的消息推送。
4. 测试示例
假设你的vendor.csv内容如下:
retailer,sales ALB/SFY Total Ecom TA,100 Peapod Total Ecom TA,200 Hy-Vee Total Ecom TA,150 Target Total Ecom TA,300 Hy-Vee Total Ecom TA,50
运行脚本后,会输出错误提示,日志文件会记录检测到的无效值Hy-Vee Total Ecom TA,并终止流程。
内容的提问来源于stack exchange,提问作者av abhishiek
相关产品推荐
相关产品推荐

