Em um awk
script, 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