【问题标题】:Sed to split based on quotes handling comma within quotes along with data without comma within multiple quotesSed 基于引号处理引号内的逗号以及多个引号内不带逗号的数据进行拆分
【发布时间】:2018-06-01 04:06:21
【问题描述】:

我有如下数据

123,"john,test",John"test,""john"",345

以上需要按以下方式拆分,

123

"john,test"

John"test

""john""

345

我尝试在拆分时使用 sed 处理引号内的逗号,但对于多个双引号内的数据,无法正确显示。而且中间有双引号的数据也没有得到处理。我尝试使用 awk,但无法使用 fpat 功能,因为我们有旧版本的 awk。

你能帮忙解决一下吗?

【问题讨论】:

  • 始终将您的示例(输入和输出)包装到代码标签中 + 始终在您的帖子中展示您的努力(您试图解决问题)。
  • @jww 再次对问题和所有答案投了反对票,所以我再次对他们投赞成票以进行补偿。

标签: linux shell unix awk sed


【解决方案1】:

这可能对你有用(GNU sed):

sed -r 's/([^",]*("[^"]*"[^",]*)*),/\1\n/g' file

用换行符替换所有没有被双引号括起来的逗号。

更深入:将零个或多个不包含双引号或逗号的字符分组,然后是零个或多个双引号组,然后是零个或多个非双引号字符(可能是逗号),然后是双引号后跟零个或多个不包含双引号的字符,后跟逗号,并用换行符替换最后的逗号。在整个文件中全局执行此操作。

现在如果双引号或逗号被引用...

【讨论】:

    【解决方案2】:

    sed 用于在单独的行上进行简单的替换,仅此而已。对于其他任何问题,例如您的问题,您应该使用 awk。请参阅What's the most robust way to efficiently parse CSV using awk? 了解如何使用任何 awk 稳健地处理 CSV,即使这些字段包含换行符但您的具体问题 - 您说您不能使用 FPAT 但 FPAT 只是一段时间内的 GNU 简写(match())循环在任何 awk 中,如果你不能这样做:

    $ awk -v FPAT='[^,]+|"[^"]+"' '{for (i=1; i<=NF;i++) print i, "<" $i ">"}' file
    1 <123>
    2 <"john,test">
    3 <John"test>
    4 <""john"">
    5 <345>
    

    然后改为这样做:

    $ awk '{ while ( match($0,/[^,]+|"[^"]+"/) ) { print ++i, "<" substr($0,RSTART,RLENGTH) ">"; $0=substr($0,RSTART+RLENGTH) } }' file
    1 <123>
    2 <"john,test">
    3 <John"test>
    4 <""john"">
    5 <345>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 2022-11-28
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多