Gnu AWK dividido por padrão e inserir colunas, mas obtenha mais delimitador

1

Eu usei o mesmo arquivo awk para processar duas cadeias diferentes. Tão ligado.

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, "a, b"

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

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

Na verdade, para o primeiro, há "," no resultado. Mas estou esperando o segundo resultado no primeiro.

    
por Na Dong 20.07.2017 / 15:20

1 resposta

0

[Não é realmente uma resposta - mas grande demais para um comentário]

Eu acho que o comportamento que você está vendo está relacionado ao primeiro átomo do seu FPAT - que potencialmente tem uma correspondência de comprimento zero, ou seja, ([^,])* correspondências zero ou mais caracteres não-vírgula - mas exatamente como está relacionado me ilude neste momento. Considere por exemplo (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

ao passo que se acessarmos o valor de NF antes da reatribuição

$ 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

Independentemente disso, o comportamento parece não ser ambíguo se você alterar FPAT para corresponder apenas a seqüências não vazias:

$ 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"
    
por 20.07.2017 / 21:53

Tags