Gnu AWKはパターンに分割して列を挿入しますが、より多くの区切り文字を取得します。

Gnu AWKはパターンに分割して列を挿入しますが、より多くの区切り文字を取得します。

2つの異なる文字列を処理するために同じファイルを使用しています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次結果に続き2次結果も期待している。

ベストアンサー1

[実際の答えではありませんが、コメントするには大きすぎます。]

考えるあなたが見る行動は関連最初の原子にFPAT- 長さがゼロになることがあります。つまり、([^,])*一致します。0以上非カンマ文字 - しかしまったく同じどのように現時点では、その関連性を理解できません。たとえば(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"

おすすめ記事