使用Awk调换字段输出顺序后出现异常的问题求助
Awk调换CSV字段输出顺序后异常的原因分析
输入文件内容
03 Oct 22, Southern ,Mad,WIN,Gro,,33.10 03 Oct 22, Mpd ,Mad,WIN,Auto,-208.56, 23 Sep 22, Thank ,n/a,WIN,,-97.93,
正常命令及输出
执行命令:
awk -F',' '{print "first " $6 " and then " $7}' input.csv
输出:
first and then 33.10 first -208.56 and then first -97.93 and then
异常命令及输出
执行调换字段顺序的命令:
awk -F',' '{print "first " $7 " and then " $6}' input.csv
输出:
and then 0 and then -208.56 and then -97.93
问题原因
- DOS格式换行符干扰:你的输入文件是DOS格式(行尾为
\r\n),导致每行的最后一个字段($7)包含隐藏的回车符\r。当打印"first " $7时,\r会将光标跳转至当前行开头,后续的" and then " $6会覆盖掉前面的first 33.10内容,最终只显示后半部分。 - 空字段的隐式类型转换:第一行的$6是空字符串,awk在某些场景下会将空字符串隐式转换为数字0,因此第一行输出
and then 0;而第二、三行的$6是有效数字,所以显示正常。
解决方案
方法1:转换文件格式为Unix格式
使用dos2unix工具转换文件:
dos2unix input.csv
方法2:在awk中直接处理回车符
修改awk命令,先移除行尾的\r:
awk -F',' '{sub(/\r$/,"",$0); print "first " $7 " and then " $6}' input.csv
处理后正常输出:
first 33.10 and then first and then -208.56 first and then -97.93
内容的提问来源于stack exchange,提问作者mdarwin
相关产品推荐
相关产品推荐

