使用awk为CSV文件第6列补前导零运行结果异常的问题咨询
awk处理CSV列补前导零异常原因及解决方案
异常原因
你所用命令的异常根源是字段拆分逻辑问题:
- 命令仅以逗号作为分隔符,拆分得到的第6列是带双引号的完整字符串(如
"123"),不是纯数值 - awk对开头为非数字的字符串做数值转换时,默认取值为0,因此
sprintf("%04d", $6)实际入参为0,输出结果全部为0000
解决方案
通用awk方案(兼容所有awk版本)
直接处理带引号的第6列,先提取数字再补零后恢复引号:
awk -F',' -v OFS=',' '{ gsub(/"/, "", $6) $6 = sprintf("\"%04d\"", $6) print }' $Input
GNU awk方案(适配更复杂的带逗号CSV场景)
如果CSV字段内部可能存在逗号,使用FPAT定义标准CSV字段规则,拆分更准确:
gawk -v FPAT='([^,]+)|(\"[^\"]+\")' -v OFS=',' '{ num = substr($6, 2, length($6)-2) $6 = sprintf("\"%04d\"", num) print }' $Input
两种方案均可输出你预期的结果。
内容的提问来源于stack exchange,提问作者G D
相关产品推荐
相关产品推荐

