awk字段分隔符问题:提取最后一个字段时输出异常
问题原因与解决办法
原因分析
问题根源是你的CSV文件使用了Windows风格的换行符\r\n,而非Linux/Unix系统默认的\n。
当用awk提取第5个字段时,该字段末尾带有隐藏的\r(回车符)。输出时,\r会强制光标跳回当前行开头,后续的右括号)就会覆盖掉insert的第一个字符i,于是出现了)nsert的异常显示。
解决办法
1. 将文件转换为Unix格式
用dos2unix直接转换:
dos2unix EURUSD.csv
如果没有dos2unix,用sed也能实现:
sed -i 's/\r$//' EURUSD.csv
2. 在脚本中处理换行符
修改提取CLOSE字段的awk命令,去掉末尾的\r:
CLOSE=`echo $line | awk -F, '{ sub(/\r$/, "", $5); print $5 }' `
3. 用awk一次性完成所有操作(更高效)
原脚本多次调用awk效率较低,直接用awk就能从头到尾处理,同时解决换行符问题:
#!/bin/bash awk -F, 'NR>1 { sub(/\r$/, "", $5); printf "insert into forex (%s, %s, %s, %s, %s)\n", $1, $2, $3, $4, $5 }' EURUSD.csv
内容的提问来源于stack exchange,提问作者carlolab
相关产品推荐
相关产品推荐

