awk:在csv文件中解析列如[1,2,3]

时间:2015-07-13 20:49:10

标签: regex csv awk

我有一个看起来像这样的csv文件:

a, b, c
1, 2, [1, 2, 3]
4, 5, [7, 7, 7, 7, 8]
5, 3, []
6, 5, [45, 45, 2, 1, 2, 8, 8]

我想通过awk提取第三列,这对我来说意味着告诉awk字段分隔符是不在一对括号内的任何逗号。所以我想提取:

c
1,2,3
7, 7, 7, 7, 8

4, 4, 2, 1, 2, 8, 8

我尝试使用正则表达式在Ubuntu命令行中设置FS Field Separator,如下所示:

awk '{FS = ["^\[],[^\]]"} {print $3}' file.csv

但是这打印出来了:

c
[
[
[]
[4

这甚至不是我喜欢的。这是我如何定义我的字段分隔符或我是否做了其他错误的问题?感谢您的任何意见。

3 个答案:

答案 0 :(得分:1)

You can use gnu-awk with FPAT:

awk 'BEGIN{ FPAT="\\[[^]]*\\]|[^,]*,? *" } {gsub(/[][]/, "", $3); print $3}' file.csv
c
1, 2, 3
7, 7, 7, 7, 8

45, 45, 2, 1, 2, 8, 8

Working Demo


EDIT: Non-gnu (BSD) awk solution:

awk -F ', *' '{$1=$2=""; gsub(/^ *|[][]/, "", $0);} 1' file.csv
c
1 2 3
7 7 7 7 8

45 45 2 1 2 8 8

答案 1 :(得分:1)

您可以将此模式用作字段分隔符:

<div id="wrapper">
    <div id="img-box"></div>
    <div id="tets"></div>
    <div id="tes3"></div>
</div>

答案 2 :(得分:0)

您也可以使用普通的csv正则表达式匹配第三个字段 这是一个稍微Perl'ish的表达式(使用分支重置) 不知道Perl模式中的 grep sed 是否有效。

编辑:取消空字符串

 # (?m)^(?:(?:^|,)[^\S\r\n]*(?|\[([^\[\]\r\n]*)\]|([^,\r\n]*?))(?:[^\S\r\n]*(?=$|,))){3}(?!^)

 (?m)
 ^ 
 (?:                      # Cluster
      (?: ^ | , )              # Delimiter
      [^\S\r\n]*               # Trim leading optional whitespaces
      (?|
           \[                       # Quoted [ ]
           ( [^\[\]\r\n]* )         # (1)
           \]
        |                         # or
           ( [^,\r\n]*? )           # (1), Non-quoted
      )
      (?:
           [^\S\r\n]*               # Trim trailing optional whitespaces 
           (?= $ | , )              # Ahead, delimiter
      )
 ){3}                     # The third field
 (?! ^ )                  # Disqualify empty string