while read循环中echo多变量输出格式异常问题求助
问题排查与解决
核心原因
输出错位、换行异常主要由以下几个问题导致:
输入文件换行符不兼容
你的file1.csv大概率是Windows格式(换行符为\r\n),而bash默认只识别\n作为换行标记。read读取时会保留\r(回车符)在$line变量中,当echo "$line"输出后,光标会回到当前行开头,后续输出的,${id2}就会覆盖行首内容,出现错位换行。id2的输出包含换行符
你执行的grep "$id1"命令可能返回多行结果,或者输出末尾自带换行符,导致$id2变量中嵌入了换行,最终输出时被拆分成多行。代码语法错误
你写的id2=grep "$id1"...."存在反引号未闭合的语法问题,这会导致id2`变量赋值异常,进一步干扰输出结果。
修正方案
处理Windows格式换行符
要么先把输入文件转换为Unix格式:dos2unix file1.csv要么在读取时直接移除
$line中的回车符:read -r line; line=${line%$'\r'}控制
id2的输出格式
如果只需要grep匹配的第一行,加上-m1参数限制结果行数;同时移除输出中的换行/回车符:id2=$(grep -m1 "$id1" ... | tr -d '\n\r')修正语法错误
推荐用$()替代反引号(更易读且避免嵌套问题),确保赋值语句闭合:id2=$(grep "$id1" ...)
修正后的完整代码示例
# 可选:转换输入文件为Unix格式 dos2unix file1.csv while read -r line; do # 移除line中的回车符 line=${line%$'\r'} id1=$(echo "$line" | grep ...) # 限制grep只取第一行并移除换行符 id2=$(grep -m1 "$id1" ... | tr -d '\n\r') # 输出无错位的CSV行 echo "$line,${id2}" >> file2.csv done < file1.csv
内容的提问来源于stack exchange,提问作者sabarish tr
相关产品推荐
相关产品推荐

