如何用Bash脚本从CSV提取关键词行并在Zenity中按列展示
解决Zenity展示CSV匹配行的列拆分问题
修正后的完整脚本
#!/bin/bash path="filename.csv" # 获取用户输入的关键词 ans=$(zenity --entry --title="输入关键词" --text="请输入要搜索的关键词(仅匹配第一列)" --timeout=10) # 处理用户取消/超时的情况 if [ -z "$ans" ]; then exit 0 fi # 精准匹配第一列、转换分隔符并传入Zenity awk -v keyword="$ans" -F ',' ' # 保留CSV表头 NR == 1 { print $0 } # 匹配第一列包含关键词的数据行 NR > 1 && $1 ~ keyword { print $0 } ' "$path" | tr ',' '\t' | zenity --list \ --title="搜索结果" \ --text="第一列包含关键词'$ans'的内容" \ --multiple \ --separator=" " \ --column="列1标题" \ --column="列2标题" \ --column="列3标题" \ --width 800 \ --height 200
关键问题修复说明
精准匹配第一列:
原脚本用grep会全局匹配关键词,可能命中非第一列的内容。改用awk的$1 ~ keyword,只检查第一列是否包含目标关键词,确保匹配准确性。解决列拆分错误:
Zenity的--list默认以空格作为列分隔符,而CSV用逗号分隔。通过tr ',' '\t'将逗号替换为制表符,Zenity会自动识别制表符并将内容拆分到对应列,避免整行内容重复填充到每一列的问题。修复脚本语法问题:
原脚本的函数定义缺少函数名且写法不规范,直接通过管道串联处理逻辑更简洁,同时增加了用户取消输入或超时的退出逻辑,避免无意义的后续执行。保留表头展示:
通过NR == 1保留CSV的表头行,让搜索结果的列对应关系更清晰。
内容的提问来源于stack exchange,提问作者user2049184
相关产品推荐
相关产品推荐

