En un awk
script, estoy intentando usar ' (' como separador de campo. Sin embargo, a menos que escape del corchete con una doble barra invertida, como esta:
BEGIN {FS=" \\("}
No funciona.
Si lo uso FS=" \("
obtengo
awk: prog:2: warning: escape sequence `\(' treated as plain `('
awk: prog:2: fatal: :, [., or [=: / (/
salida y si no escapo del corchete en absoluto obtengo solo el
awk: prog:2: fatal: :, [., or [=: / (/
mensaje.
¿Puedes explicar este comportamiento?
Respuesta1
Para usar ␣(
(espacio+paréntesis) como separador de campo en awk
, use "␣\\\("
:
$ echo "a (b (c" | awk -F " \\\(" '{ print $1; print $2; print $3 }'
a
b
c
Como alternativa, utilice comillas simples y dos barras invertidas:
$ echo "a (b (c" | awk -F ' \\(' '{ print $1; print $2; print $3 }'
a
b
c
La razón de esto es que ␣(
(un paréntesis simpleconun espacio inicial) es una expresión regular con formato incorrecto. El paréntesis izquierdo abre una agrupación que nunca se cierra. Por eso es necesario escapar de él.
La razón por la que (
(un solo paréntesissinun espacio inicial) funciona es que cuando FS
es un solo carácter, no se trata como una expresión regular.
Respuesta2
Encontré este hilo mientras buscaba una solución a un problema similar: usar ␣
OR (
como separador de campo para awk. Esto no respondió del todo, pero déjame llegar a mi solución:
Si desea que la combinación ␣(
como una sola unidad separe archivos en awk, haga 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
Si está buscando una solución a mi problema similar, O ␣
O (
haga lo siguiente 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