我有一个看起来像这样的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
这甚至不是我喜欢的。这是我如何定义我的字段分隔符或我是否做了其他错误的问题?感谢您的任何意见。
答案 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
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