Zsh脚本CSV匹配异常:第三列搜索结果无法输出求助
问题分析与修复:Zsh脚本CSV搜索第三列无输出
问题描述
现有一个3列的Input.csv,需要用每行的三个列值依次在Search.csv中搜索,匹配后返回对应行的指定列。当前Zsh脚本前两列搜索正常,但第三列的结果始终无法输出。
输入文件内容
Input.csv:
A1,A2,A3 B1,B2,B3
Search.csv:
A1,Name2,C2,UniqueID1,C2,C3,C4 A3,Name2,C2,UniqueID2,C2,C3,C4 A2,Name4,C2,UniqueID3,C2,C3,C4 B2,Name4,C2,UniqueID4,C2,C3,C4 B3,Name3,C2,UniqueID5,C2,C3,C4 B1,Name2,C2,UniqueID6,C2,C3,C4
期望与当前输出
期望输出:
/Name2/UniqueID1/ /Name4/UniqueID3/ /Name2/UniqueID2/ /Name2/UniqueID6/ /Name4/UniqueID4/ /Name3/UniqueID5/
当前输出:
/Name2/UniqueID1/ /Name4/UniqueID3/ /Name2/UniqueID6/ /Name4/UniqueID4/
核心问题分析
脚本的问题出在冗余的结果累积逻辑和无效的变量传值方式:
- 原脚本试图将三个列的搜索结果累积到
row_result变量,但实际上需求是每个匹配单独输出一行,累积逻辑完全多余。 - 函数
search_for_input_var中通过变量名传递row_result的方式无法在Zsh中修改外部变量,且开头的result_var=""会清空传入值,导致第三列搜索结果被丢弃。
修复后的完整脚本
#!/bin/zsh # 处理CSV文件的函数 process_csv() { local input_file="$1" local search_column="$2" local search_file="$3" local output_column1="$4" local output_column2="$5" # 遍历输入CSV文件的每一行 while IFS= read -r input_line || [[ -n "$input_line" ]]; do # 分割当前行到数组 IFS=',' read -r -A input_values <<< "$input_line" input_var1="${input_values[1]}" input_var2="${input_values[2]}" input_var3="${input_values[3]}" # 依次搜索三个变量,直接输出结果 search_for_input_var "$input_var1" "$search_file" "$search_column" "$output_column1" "$output_column2" search_for_input_var "$input_var2" "$search_file" "$search_column" "$output_column1" "$output_column2" search_for_input_var "$input_var3" "$search_file" "$search_column" "$output_column1" "$output_column2" done < "$input_file" } # 在搜索CSV中查找指定变量的函数 search_for_input_var() { local input_var="$1" local search_file="$2" local search_column="$3" local output_column1="$4" local output_column2="$5" # 遍历搜索CSV文件的每一行 while IFS= read -r search_line; do # 分割当前行到数组 IFS=',' read -r -A search_values <<< "$search_line" search_var="${search_values[$search_column]}" # 匹配成功则输出结果并终止当前搜索 if [ "$input_var" = "$search_var" ]; then echo "/${search_values[$output_column1]}/${search_values[$output_column2]}/" break fi done < "$search_file" } # 使用示例: ./process_csv.sh Input.csv 1 Search.csv 2 4 input_csv="$1" search_column="$2" search_csv="$3" output_column1="$4" output_column2="$5" process_csv "$input_csv" "$search_column" "$search_csv" "$output_column1" "$output_column2"
关键修复说明
- 移除冗余的结果累积逻辑:直接在
search_for_input_var中输出匹配结果,每个搜索结果单独占一行,完全符合需求。 - 删除无效的变量传值代码:去掉了所有关于
row_result的传递和重置操作,简化逻辑的同时避免了变量值被意外清空。 - 保留核心搜索逻辑:保留了原有的CSV分割、列匹配和终止搜索的逻辑,确保功能正确性。
运行修复后的脚本,执行命令./process_csv.sh Input.csv 1 Search.csv 2 4即可得到期望的输出。
内容的提问来源于stack exchange,提问作者JVGen
相关产品推荐
相关产品推荐

