Gnu AWK 按模式分割并插入列,但获得更多分隔符

Gnu AWK 按模式分割并插入列,但获得更多分隔符

我使用同awk一个文件来处理两个不同的字符串。如此有线。

cat test.awk
BEGIN{FPAT="([^,])*|(\"[^\"]+\")";OFS=","}{$4="TDP,-1,-1,0,0"OFS$4;print $0}
  1. echo "a,b,b,b,b,b,b,b,b,b,b,b,\"a,b\"" | gawk -f test.awk

    a,b,b,TDP,-1,-1,0,0,b,,b,b,b,b,b,b,b,b,"a,b"

  2. echo "a,b,,\"a,b\""|gawk -f test.awk

    a,b,,TDP,-1,-1,0,0,"a,b"

实际上,对于第一个,结果中有“,,”。但我期待第一个结果的第二个结果。

答案1

[不是真正的答案 - 但太大,无法发表评论]

思考你看到的行为是有关的到你的第一个原子FPAT- 它可能有一个零长度匹配,即([^,])*匹配零个或多个非逗号字符 - 但完全一样如何在这一点上,我无法理解它的相关性。例如(GNU Awk 4.0.1):

$ echo "a,b,c,d,e,f,g,h,i,j,k,l,\"m,n\"" | 
  gawk '
    BEGIN{FPAT="([^,])*|(\"[^\"]+\")";OFS=","}
    {print $0; $4=$4; print $0; print NF}
  '      a,b,c,d,e,f,g,h,i,j,k,l,"m,n"
a,b,c,d,,e,f,g,h,i,j,k,l,"m,n"
14

NF而如果我们访问重新分配之前的值

$ echo "a,b,c,d,e,f,g,h,i,j,k,l,\"m,n\"" | 
  gawk '
    BEGIN{FPAT="([^,])*|(\"[^\"]+\")";OFS=","}
    {print $0; print NF; $4=$4; print $0; print NF}
  '
a,b,c,d,e,f,g,h,i,j,k,l,"m,n"
13
a,b,c,d,e,f,g,h,i,j,k,l,"m,n"
13

FPAT无论如何,如果您更改为仅匹配非空序列,则行为似乎是明确的:

$ echo "a,b,c,d,e,f,g,h,i,j,k,l,\"m,n\"" | 
  gawk '
    BEGIN{FPAT="([^,]+)|(\"[^\"]+\")";OFS=","}
    {$4="TDP,-1,-1,0,0" OFS $4; print $0}
  '
a,b,c,TDP,-1,-1,0,0,d,e,f,g,h,i,j,k,l,"m,n"

相关内容