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

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

Em um awkscript, estou tentando usar '(' como separador de campos. No entanto, a menos que eu escape do colchete com uma barra invertida dupla, assim:

BEGIN {FS=" \\("}

não funciona.

Se eu usar FS=" \("eu ganho

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

saída e se eu não escapar do colchete, recebo apenas o

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

Você pode explicar esse comportamento?

Responder1

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 isto é que ␣((um único parêntesecomum espaço à esquerda) é uma expressão regular malformada. O parêntese esquerdo abre um agrupamento que nunca é fechado. É por isso que precisa ser escapado.

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

Responder2

Encontrei este tópico ao procurar uma solução para um problema semelhante - usando OR (como separador de campos para o awk. Isso não respondeu bem, mas deixe-me ver minha solução:

se você quiser a combinação ␣(como uma única unidade para separar arquivos no awk, faça awk -F '( \\()' ...:

$ echo "This (maybe) is a test()" | awk -F '( \\()' '{print $1 "\n" $2 "\n" $3 "\n" $4 "\n" $5 "\n" $6 "\n" $7; print "Number of Fields: " NF}'
This
maybe) is a test()





Number of Fields: 2

Se você está procurando uma solução para meu problema semelhante - OR (, faça awk -F '( |\\()' ...:

$ echo "This (maybe) is a test()" | awk -F '( |\\()' '{print $1 "\n" $2 "\n" $3 "\n" $4 "\n" $5 "\n" $6 "\n" $7; print "Number of Fields: " NF}'
This

maybe)
is
a
test
)
Number of Fields: 7

informação relacionada