如何在awk中将","设置为字段分隔符处理带逗号的CSV字段
正确实现方式
方案1:直接指定多模式分隔符
你之前用'","'作为分隔符的思路是对的,但漏了行首和行尾单独存在的双引号,只要把这两部分也加入分隔符匹配规则即可:
awk -F '^"|"$|","' '{print $2, $3, $4}' file
规则说明:
^"匹配行首的双引号"$匹配行尾的双引号","匹配字段之间的分隔符- 三者用
|(正则或)拼接后,分割得到的$2/$3/$4就是无多余引号的纯字段内容,你的示例文件运行后输出为:1 ab,c def
方案2:用FPAT匹配字段(更通用的CSV处理方案,仅GNU awk支持)
如果你的CSV字段格式更复杂,推荐直接指定字段的匹配规则,不需要手动处理分隔符:
awk 'BEGIN{FPAT="([^,]*)|(\"[^\"]+\")"} {print $1, $2, $3}' file
规则说明:FPAT会直接匹配符合规则的字段内容,这里的规则是要么匹配不带逗号的普通内容,要么匹配被双引号包裹的内容(内部允许包含逗号),适用性更强。
错误写法原因说明
awk -F "," '{print $0}' file:直接按逗号分割,会把字段内部的逗号也识别成分隔符,把ab,c拆成两个字段awk -F "","" '{print $0}' file:引号没有正确闭合,shell层面就会报语法错误,无法执行awk -F '","' '{print $0}' file:仅按","分割的话,你的示例行会被拆为"1、ab,c、def",首尾字段会带多余的双引号,不符合预期
内容的提问来源于stack exchange,提问作者tonyibm
相关产品推荐
相关产品推荐

