You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本无法将匹配邮箱写入CSV文件问题排查

脚本无法写入匹配结果的问题分析与修复

问题场景

我有输入文件users.txt,内容如下:

rajesh.kumar@company.com
rhmn@company.com
mkkumar@company.com
manish.panday@company.com
daniel.m@company.com
jain@company.com
abul@company.com
aditi@company.com
aditya.s@company.com

编写了如下Bash脚本,意图逐行读取users.txt,将与指定列表匹配的邮箱写入result.csv:

#!/bin/bash

Input_file="users.txt"
Output_file="result.csv"
Match_list="$(command_to_get_match_user)"
Email="$(echo "$Match_list" | awk -F '|' '{print $4}' | tr -d '[:space:]')"

while read line; do
  if [[ "$line" == *"$Email"* ]]; then
    echo "$line" >> "$Output_file"
  fi
done < "$Input_file"

其中command_to_get_match_user命令的输出为:

1320 | | Rajesh Kumar | rajesh.kumar@company.com | live
1584 | | A.K.M. Rahman | rhmn@company.com | live
1503 | | Mukesh Kumar | mkkumar@company.com | live
1279 | | Aayush Jain | aayush.jain@company.com | live
1597 | | Abul Hasan Md Osama | abul.osama@company.com | live
1660 | | Aditi Singpuri | aditi.singpuri@company.com | live
1570 | | Aditya Jain | aditya.jain@company.com | live

目前脚本未生成任何匹配结果写入result.csv,求问题原因及修复方案。

问题根源

  1. Email变量取值逻辑错误
    原脚本中,Email变量是把Match_list所有行的第4列(邮箱)提取后拼接成一个多行字符串。而[[ "$line" == *"$Email"* ]]的判断逻辑是检查当前行是否包含这个完整的多行字符串——这显然不可能,因此没有任何匹配。

  2. 未遍历匹配邮箱列表
    脚本只做了一次全局匹配判断,没有逐个检查Match_list中的每个邮箱是否存在于users.txt中。

修复方案

方案一:用数组存储匹配邮箱,遍历匹配

逻辑直观,适合理解基础循环的场景:

#!/bin/bash

Input_file="users.txt"
Output_file="result.csv"
Match_list="$(command_to_get_match_user)"

# 将所有匹配邮箱提取后存入数组,同时去除空格
readarray -t Emails < <(echo "$Match_list" | awk -F '|' '{gsub(/ /, "", $4); print $4}')

# 清空输出文件,避免多次运行重复写入内容
> "$Output_file"

# 遍历users.txt的每一行
while read -r line; do
  # 遍历每个匹配邮箱,检查是否与当前行完全一致
  for email in "${Emails[@]}"; do
    if [[ "$line" == "$email" ]]; then
      echo "$line" >> "$Output_file"
      break  # 匹配到就跳出循环,避免同一行重复写入
    fi
  done
done < "$Input_file"

方案二:用grep高效匹配(推荐)

利用grep的正则匹配能力,无需循环,处理大文件更高效:

#!/bin/bash

Input_file="users.txt"
Output_file="result.csv"
Match_list="$(command_to_get_match_user)"

# 提取所有匹配邮箱,用|拼接成grep的扩展正则模式
pattern=$(echo "$Match_list" | awk -F '|' '{gsub(/ /, "", $4); print $4}' | paste -sd '|' -)

# 用grep精确匹配整行内容,结果直接写入输出文件
grep -Fx -E "$pattern" "$Input_file" > "$Output_file"
  • -F:将模式作为固定字符串处理,避免正则特殊字符干扰
  • -x:只匹配整行完全一致的内容
  • -E:启用扩展正则,支持|分隔多匹配项

额外优化点

原脚本中使用>>追加写入,多次运行会导致result.csv内容重复。修复方案中加入了清空文件的操作(> "$Output_file"或用>直接覆盖写入),确保每次运行结果都是最新的。


内容的提问来源于stack exchange,提问作者user4948798

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 23:28:13