当分隔符(竖线)为内容一部分时,如何用awk处理CSV文件?
处理含引号包裹分隔符的竖线分隔CSV(awk高效方案)
遇到这种带引号字段包含分隔符的CSV确实头疼,尤其是1000万条记录的大数据量,既要保证正确性又得兼顾效率。普通的awk -F'|'会把引号内的竖线当成分隔符,直接破坏字段结构,这里给你一个awk原生的高效解决方案:
核心思路:用FPAT定义字段模式
awk的FPAT变量可以用来定义字段的匹配规则,而非单纯指定分隔符。我们可以利用它识别两种字段:
- 不含竖线的普通字段:
[^|]+ - 双引号包裹的字段(内部可包含竖线):
"[^"]+"
这样awk就能自动跳过引号内的竖线,正确识别每个字段。
完整awk脚本示例
BEGIN { # 定义字段模式:要么是无竖线的字符串,要么是双引号包裹的字符串 FPAT = "([^|]+)|(\"[^\"]+\")" } # 处理每一行的逻辑,这里以打印第1列和第7列为例 { # 如果需要去掉字段的双引号,用gsub处理 cleaned_col7 = $7 gsub(/^"|"$/, "", cleaned_col7) printf "第1列:%s\n第7列(去引号后):%s\n\n", $1, cleaned_col7 # 其他业务逻辑写在这里,比如写入文件、统计等 }
测试你的示例数据
把你提供的示例行作为输入:
SE Australia|PRM|2017-09-07T16:11:33|2641|-5537383165259899960|2017-09-07T16:12:17|"AU en2|networking-locator"|-|SC7_Electricians_Installer (only provides labor)|p-0715125|1
运行脚本后,输出会是:
第1列:SE Australia 第7列(去引号后):AU en2|networking-locator
完全正确识别了带竖线的字段,不会拆分它。
注意事项
- 效率适配大数据量:这个方案是awk原生支持的,处理1000万条记录的效率很高,比调用外部工具(比如csvkit)要快得多,适合大规模数据处理。
- 转义双引号的情况:如果你的CSV里存在转义双引号(比如用
""表示一个"),需要调整FPAT为:
这样就能正确识别内部带转义双引号的字段。FPAT = "([^|]+)|(\"([^\"]|\"\")+\")" - 字段计数:处理后
NF会正确显示为11,和你的CSV列数一致,不用担心列数偏移问题。
内容的提问来源于stack exchange,提问作者pm1359
相关产品推荐
相关产品推荐

