【问题标题】:How to escape multiple quotes and commas within quotes?如何在引号中转义多个引号和逗号?
【发布时间】:2016-10-19 20:01:25
【问题描述】:

如何使用 awk 正确转义多个引号和逗号,以分隔由引号括起来的 csv 字段?下面的例子应该更清楚:

有:

mike,3
"first, second",6 
"height 6""7""", good","4, 5"

想要(用 [] 标记的所需分隔):

[mike] [3]
["first, second"] [6] 
["height 6""7""", good"] ["4, 5"]

尝试GNU awk with the FPAT variable 没有运气:

gawk -vFPAT="([^,]+)|(\"[^\"]+\")" '{print $1}' my_file.csv
mike
"first, second"
"height 6""7""" # note the missing ", good"

Excel 和/或 LibraOffice 可以正确解析此 csv 而不会出现问题。必须有一种方法来解析它。非常感谢您的帮助。

【问题讨论】:

  • 使用 PHP/python 的正确 CSV 解析器而不是 awk
  • 谢谢@anubhava。我应该添加一些上下文。这是几 GB 数据(Mapreduce 作业的输出)的数据管道的一部分,我想做更多的流编辑以将数据缩小到可管理的大小以输入 python。

标签: regex bash csv awk sed


【解决方案1】:

这应该可以...

$ awk -v FPAT='[^,]+|"[^"]+"|"([^"]*""+[^"]*)+"' ...

但是,我认为需要折叠多个引号。

在行动

$ awk -v FPAT='[^,]+|"[^"]+"|"([^"]*""+[^"]*)+"' -v OFS='> <' '{print "<"$1,$2">"}' file

<mike> <3>
<"first, second"> <6>
<"height 6""7""", good"> <"4, 5">

【讨论】:

  • 谢谢,这解决了原来的问题,但不是更新的问题(也可以引用第二个字段)。不举一个有代表性的例子是我的坏事。
  • 我看不出有什么不同。你得到了什么?
  • 嗯,我无法复制我认为有问题的内容。一定是早点做梦。该解决方案很好地解析了我的文件。谢谢!至于折叠引号,在我的情况下这不是问题,因为我将在 awk 处理后用 Python 或 R 解析它,他们可以处理它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
相关资源
最近更新 更多