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