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

6

En un awkscript estoy tratando de usar '(' como el separador de campo. Sin embargo, a menos que salga del corchete con doble barra diagonal inversa, así:

BEGIN {FS=" \\("}

No funciona.

Si uso FS=" \("obtengo

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

salida y si no escapo del soporte en absoluto obtengo solo el

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

¿Puedes por favor explicar este comportamiento?

Arkonix
fuente

Respuestas:

7

Para usar ␣((espacio + paréntesis) como separador de campo awk, use "␣\\\(":

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

Alternativamente, use 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 único con un espacio inicial) es una expresión regular malformada. El paréntesis izquierdo abre una agrupación que nunca se cierra. Es por eso que necesita ser escapado.

La razón por la que funciona ((un paréntesis sin espacio inicial) es que cuando se FStrata de un solo carácter, no se trata como una expresión regular.

Kusalananda
fuente
1

Encontré este hilo al buscar una solución a un problema similar: usar OR (como separador de campo para awk. Esto no lo respondió del todo, pero déjame mi solución:

si desea que la combinación ␣(como una sola unidad separe archivos en awk, 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: 2

Si está buscando una solución a mi problema similar, O bien (, 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
JayRugMan
fuente