使用awk的FPAT解析CSV输出错误,如何获取正确字段?
解决MacOS BSD awk解析含逗号引号CSV字段的问题
MacOS自带的是BSD awk(你的版本20200816),其FPAT的正则匹配逻辑和GNU awk略有差异,针对你需要提取"PhD, Ecology"这类带引号且内部含逗号的字段,需要用精准的FPAT配置:
正确FPAT配置与示例
针对标准CSV格式(双引号包裹含特殊字符的字段,内部双引号用""转义),设置FPAT为:
awk -v FPAT='([^,]+)|("[^"]*(\"\"[^\"]*)*\")' '{print $1}' your.csv
测试示例
假设你的CSV内容是:
"PhD, Ecology",Biology,"Master, ""Environmental Science"""
执行上述命令后,第一个字段会正确输出:
"PhD, Ecology"
如果需要去除字段首尾的双引号,并将内部的""转义为单个",可以扩展处理逻辑:
awk -v FPAT='([^,]+)|("[^"]*(\"\"[^\"]*)*\")' '{ # 处理第一个字段 field = $1 gsub(/^"|"$/, "", field) # 去掉首尾双引号 gsub(/""/, "\"", field) # 把""替换为" print field }' your.csv
输出结果:
PhD, Ecology
问题原因说明
你之前得到Ecology",Biology的错误结果,大概率是FPAT的正则未正确匹配完整的引号包裹字段。比如错误的正则可能只匹配到了引号内的部分内容,或者未处理引号内的逗号,导致awk将逗号错误地识别为字段分隔符。
内容的提问来源于stack exchange,提问作者M3RS
相关产品推荐
相关产品推荐

