Bash脚本解析CSV文件交换列输出顺序后格式异常求助
问题原因
你的CSV文件使用了Windows风格的换行符(CRLF,即\r\n结尾),而非Unix/Linux默认的LF(\n)结尾:
- 你自定义IFS为
,之后,read命令只会按逗号拆分字段,行尾的\r不会被自动处理,会被直接附加到第二个字段f2的末尾 - 当执行
echo "$f2, $f1"时,f2末尾的\r会让终端光标回到当前行的行首,后续输出的, $f1内容会直接覆盖f2开头的内容,就出现了你看到的错位现象 - 之前输出
$f1, $f2时,\r刚好在整行输出的末尾,换行后不会产生可见影响,所以你误认为当时的结果是完全正常的。
解决思路
方法1:预先转换CSV文件为Unix换行格式
使用dos2unix工具直接修改原文件:
dos2unix file.csv
如果没有安装dos2unix,也可以用sed处理:
sed -i 's/\r$//' file.csv
转换后再运行你原来的脚本即可正常输出。
方法2:调整脚本逻辑,无需修改原文件
你可以直接修改读取逻辑,过滤掉行尾的回车符,两种常用写法:
写法1:将回车符加入IFS分隔符
让read自动把\r当做字段分隔符忽略:
#! /bin/sh OLDIFS=$IFS IFS=$',\r\n' while read -r f1 f2; do echo "$f2, $f1" done < file.csv IFS=$OLDIFS
写法2:读取后手动去除行尾回车符
#! /bin/sh OLDIFS=$IFS IFS=',' while read -r line; do # 移除行尾的\r line=${line%$'\r'} # 拆分两个字段 f1=${line%%,*} f2=${line#*,} echo "$f2, $f1" done < file.csv IFS=$OLDIFS
内容的提问来源于stack exchange,提问作者Andrew Lin
相关产品推荐
相关产品推荐

