Input field separator no awk

2

Eu tenho muitos arquivos de dados grandes. O delimitador entre os campos é um ponto e vírgula. No entanto, descobri que há ponto e vírgula em alguns dos campos, portanto, não posso simplesmente usar o ponto-e-vírgula como um separador de campo.

O exemplo a seguir tem 4 campos, mas o awk vê apenas 3, porque o '1' no campo 3 é removido pelo regex (que inclui um '-' porque alguns dos dados numéricos são negativos):

echo '"This";"is";1;"line of; data"' | awk -F'[0-9"-];[0-9"-]' '{print "No. of fields:\t"NF; print "Field 3:\t" $3}'
No. of fields:  3
Field 3:        ;"line of; data"

Claro,

echo '"This";"is";1;"line of; data"' | awk -F';' '{print "No. of fields:\t"NF}'
No. of fields:  5

resolve esse problema, mas conta o último campo como dois campos separados.

Alguém sabe uma solução para isso?

Obrigado!

Matthijs

    
por Matthijs 05.10.2012 / 22:43

1 resposta

2

Você precisará usar GNU awk e FPAT :

awk 'BEGIN { FPAT = "([^;]+)|(\"[^\"]+\")" } { for (i=1; i<=NF; i++) print $i }'

Teste:

echo '"This";"is";1;"line of; data"' | awk 'BEGIN { FPAT = "([^;]+)|(\"[^\"]+\")" } { for (i=1; i<=NF; i++) print $i }'

Resultados:

"This"
"is"
1
"line of; data"
    
por 06.10.2012 / 00:53

Tags