Usando '(' (espacio seguido de paréntesis) como separador de campos en awk

Usando '(' (espacio seguido de paréntesis) como separador de campos en awk

En un awkscript, 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 FSes 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

información relacionada