在awk中用双引号转义分隔符

我正在使用awk来使用“,”作为分隔符来解析我的数据,因为输入是一个csv文件。但是,数据中存在用双引号(“ ...”)进行转义的“,”。



filed1,filed2,field3,"field4,FOO,BAR",field5

如何忽略双引号中的逗号“,”,以便可以使用awk正确解析输出?我知道我们可以在excel中做到这一点,但是我们如何在awk中做到这一点呢?


侃侃尔雅
浏览 3728回答 3
3回答

交互式爱情

使用GNU awk 4很简单:zsh-4.3.12[t]% awk '{&nbsp;&nbsp;for (i = 0; ++i <= NF;)&nbsp; &nbsp;printf "field %d => %s\n", i, $i&nbsp;}' FPAT='([^,]+)|("[^"]+")' infilefield 1 => filed1field 2 => filed2field 3 => field3field 4 => "field4,FOO,BAR"field 5 => field5根据OP要求添加一些注释。摘自GNU awk手册“按内容定义字段:FPAT的值应该是提供正则表达式的字符串。此正则表达式描述每个字段的内容。对于上面显示的CSV数据,每个字段要么是“不是逗号的任何内容”,要么是“双引号,任何不是双引号的内容和右双引号。”如果以正则表达式形式编写不变,我们将有/([^,]+)|("[^"]+")/。将其写为字符串需要我们转义双引号,从而导致:FPAT = "([^,]+)|(\"[^\"]+\")"使用+两次,这不适用于空白字段,但也可以修复:如所写,用于FPAT的正则表达式要求每个字段至少包含一个字符。直接修改(将第一个' +' 更改为' *')允许字段为空:FPAT = "([^,]*)|(\"[^\"]+\")"

慕莱坞森

诸如Perl这样的完全成熟的CSV解析器Text::CSV_XS是专门为处理这种怪异而构建的。假设您只想打印第四个字段:perl -MText::CSV_XS -lne 'BEGIN{$csv=Text::CSV_XS->new()} if($csv->parse($_)){ @f=$csv->fields(); print "\"$f[3]\"" }' file输入行被拆分为数组@f字段4,这是$f[3]因为Perl从0开始索引
打开App,查看更多内容
随时随地看视频慕课网APP