Bash脚本未在output.csv的B列写入匹配状态问题排查
问题分析与解决:Bash脚本未正确生成CSV状态列
输入文件内容
input.csv内容
| filename |
|---|
| a.c |
| a.cpp |
| a.xml |
| abc.txt |
| abcd.json |
textfile.txt内容
/data/reports/a.c /data/reports/dir1/a.cpp /data/reports/dir2/samples/b.java /data/reports/dir3/yum/c.json /data/reports/rate/abcd.json /data/reports/d.xml
需求
检查input.csv中的filename是否存在于textfile.txt中,存在则在output.csv的B列写入"existing",否则留空。
原脚本的问题
原脚本有三个核心错误:
- 错误读取列:input.csv只有1列,却声明了
existing变量,这个变量实际为空,导致输出时B列始终是空白。 - 多余列输出:脚本错误添加了第三列
matched,完全不符合预期的两列格式。 - 未处理表头:直接读取input.csv会把第一行的"filename"表头当作数据处理,导致输出出现无效行。
修正后的脚本
#!/bin/bash # 先写入output.csv的表头 echo "filename,status" > output.csv # 跳过input.csv的表头,读取后续数据行 tail -n +2 input.csv | while IFS=, read -r filename || [[ -n "$filename" ]]; do # 用固定字符串匹配路径末尾的文件名,避免误匹配 if grep -qF "/$filename" textfile.txt; then echo "$filename,existing" >> output.csv else echo "$filename," >> output.csv fi done
关键修正说明
- 表头处理:先写入output.csv的表头,同时用
tail -n +2跳过input.csv的表头,确保只处理有效数据。 - 精准匹配:使用
grep -qF "/$filename",-F表示按固定字符串匹配(避免文件名含特殊字符导致grep解析出错),/$filename确保匹配的是路径末尾的完整文件名(比如防止a.c误匹配到abc.c)。 - 输出格式对齐:严格按照预期的两列格式输出,不存在则B列留空。
最终预期输出
| filename | status |
|---|---|
| a.c | existing |
| a.cpp | existing |
| a.xml | |
| abc.txt | |
| abcd.json | existing |
内容的提问来源于stack exchange,提问作者user4948798
相关产品推荐
相关产品推荐

