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

joo*_*nji 27 awk delimiter separator double-quotes

我使用awk用","解析我的数据作为分隔符,因为输入是一个csv文件.但是,数据中有","由双引号("...")转义.

filed1,filed2,field3,"field4,FOO,BAR",field5
Run Code Online (Sandbox Code Playgroud)

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

Dim*_*lov 22

使用GNU awk 4很容易:

zsh-4.3.12[t]% awk '{ 
 for (i = 0; ++i <= NF;)
   printf "field %d => %s\n", i, $i
 }' FPAT='([^,]+)|("[^"]+")' infile
field 1 => filed1
field 2 => filed2
field 3 => field3
field 4 => "field4,FOO,BAR"
field 5 => field5
Run Code Online (Sandbox Code Playgroud)

根据OP要求添加一些注释.

GNU awk手册:

FPAT的值应该是一个提供正则表达式的字符串.此正则表达式描述了每个字段的内容.对于上面显示的CSV数据,每个字段都是"任何不是逗号",或"双引号,任何不是双引号的内容,以及结束双引号."如果写为正则表达式常量(参见第3章[正则表达式],第37页),我们将有/([^,] +)|("[^"] +")/.将其写为字符串需要我们转义双引号,导致:FPAT ="([^,] +)|(\"[^ \"] + \")"

  • 内置变量 *FPAT* 是在 *GNU awk 4* 中引入的。我刚刚在您的原始帖子中发布了 *Perl* 解决方案。 (2认同)

D B*_*Bro 11

FPAT在引用字段中有换行符和逗号时有效,但在有双引号时则不行,如下所示:

field1,"field,2","but this field has ""escaped"" quotes"
Run Code Online (Sandbox Code Playgroud)

您可以使用我编写的名为csvquote的简单包装程序,使awk能够轻松解释数据,然后恢复有问题的特殊字符,如下所示:

csvquote inputfile.csv | awk -F, '{print $4}' | csvquote -u
Run Code Online (Sandbox Code Playgroud)

有关代码和文档,请参阅https://github.com/dbro/csvquote

  • 嗨@DBro Double-doublequotes可以用来扩展FPAT regexp:`BEGIN {FPAT ="(\"([^ \"] | \"\")*\")|([^,\" ]*)"}` (2认同)