使用Bash提取CSV第二列路径时误报“路径不存在”的问题
问题解决:路径存在却提示“Path not found”的原因与修复
核心原因
你的CSV文件大概率是Windows格式(CRLF换行),导致读取的$col2变量末尾带有隐藏的回车符\r。实际执行检查时,脚本判断的路径是//data/sub-1235/ses-02\r(末尾多了不可见的\r),系统自然找不到这个不存在的路径。
修复方案
方案1:预处理去除回车符
在管道中加入tr -d '\r',提前清除所有Windows换行带来的回车符:
#!/bin/bash csv_file="input.csv" # 跳过首行并清除回车符 sed '1d' "$csv_file" | tr -d '\r' | while IFS=, read -r col1 col2 rest; do if [[ ! -e "$col2" ]]; then echo "Path not found: $col2" fi done
方案2:读取后清理变量
如果不想修改管道流程,可以在路径检查前单独清理$col2变量:
#!/bin/bash csv_file="input.csv" sed '1d' "$csv_file" | while IFS=, read -r col1 col2 rest; do # 去除变量末尾的回车符 col2=${col2%$'\r'} if [[ ! -e "$col2" ]]; then echo "Path not found: $col2" fi done
验证问题的方法
可以先打印$col2的十六进制编码,确认是否存在回车符(ASCII码0D):
sed '1d' "$csv_file" | while IFS=, read -r col1 col2 rest; do echo "$col2" | xxd done
如果输出行末尾出现0d,就坐实了回车符的问题。
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

