Usando '(' (espaço seguido por parênteses) como separador de campos no awk

6

Em um script awk estou tentando usar '(' como o separador de campo. No entanto, a menos que eu escape do suporte com duas barras invertidas, assim:

BEGIN {FS=" \("}

não funciona.

Se eu usar FS=" \(" , obtenho

awk: prog:2: warning: escape sequence '\(' treated as plain '('
awk: prog:2: fatal: :, [., or [=: / (/

saída e se eu não escapar do suporte em tudo eu recebo apenas o

awk: prog:2: fatal: :, [., or [=: / (/ message.

Por favor, você pode explicar esse comportamento?

    
por Arkonix 01.06.2015 / 19:52

1 resposta

7

Para usar ␣( (espaço + parênteses) como separador de campo em awk , use "␣\\(" :

$ echo "a (b (c" | awk -F " \\(" '{ print $1; print $2; print $3 }'
a
b
c

Como alternativa, use aspas simples e duas barras invertidas:

$ echo "a (b (c" | awk -F ' \(' '{ print $1; print $2; print $3 }'
a
b
c

A razão para isso é que ␣( (um parêntese único com um espaço à esquerda) é uma expressão regular malformada. O parêntese esquerdo abre um agrupamento que nunca é fechado. É por isso que ele precisa escapar.

A razão pela qual ( (um parêntese único sem um espaço à esquerda) funciona é que quando FS é um único caractere, ele não é tratado como expressão regular.

    
por 01.06.2015 / 21:19

Tags