Tenemos la mejor información que hemos encontrado on line. Esperamos que te sirva de ayuda y si deseas compartir algún detalle que nos pueda ayudar a mejorar hazlo libremente.
¡Muy buena pregunta! creo que el key Es esto: “Por lo tanto, el programa que se muestra al comienzo de esta sección también se podría escribir Por aquí:”
No es obligatorio estar escrito de esta manera. Es una especie de forma alternativa. Esto significa (y se ha demostrado en acción) que las siguientes declaraciones son correctas:
$ awk '/12/ print $0 /21/ print $0 ' file
$ awk '/12/ print $0 ; /21/ print $0 ' file
Creo que este uso de punto y coma es para cubrir un código idiomático muy corto, por ejemplo, casos en los que omitimos la parte de acción y queremos aplicar varias reglas en la misma línea:
$ awk '/12//21/' file
awk: cmd. line:2: /12//21/
awk: cmd. line:2: ^ unexpected newline or end of string
En este caso, es obligatorio usar un punto y coma para separar las reglas (=condiciones):
$ awk '/12/;/21/' file
Desde el action
parte se omite en ambas reglas/ambas condiciones, la acción predeterminada se realizará para cada regla = print $0
En gawk, estas dos citas del manual describen el problema:
Una acción consta de una o más declaraciones awk, encerradas entre llaves (‘…’). Cada declaración especifica una cosa a hacer. Las declaraciones están separadas por líneas nuevas o punto y coma.
Un punto y coma es un “separador“pero no un”terminador“.
El único terminador válido de una acción es una llave de cierre (}
).
Por lo tanto, lo que sigue a una llave de cierre de acción (}
) debe ser otro patrón acción
en el “hombre maullar” hay alguna otra descripción que puede ayudar a aclarar qué debe hacer awk:
Las declaraciones terminan con saltos de línea, punto y coma o ambos. Los grupos de instrucciones, como acciones o cuerpos de bucle, se bloquean mediante … como en C. La última instrucción de un bloque no necesita un terminador.
El hombre desnudo“lo explica así:
El patrón viene primero, y luego la acción. Las declaraciones de acción están encerradas entre y .
Y, si desea profundizar en los detalles, lea la descripción de POSIX:
action : '' newline_opt ''
| '' newline_opt terminated_statement_list ''
| '' newline_opt unterminated_statement_list ''
;
Y busque lo que es una lista de declaraciones “no terminadas”.
O, más simple, busque Acción para leer:
Cualquier declaración individual puede ser reemplazada por una lista de declaraciones encerrada entre llaves. La aplicación garantizará que las declaraciones en una lista de declaraciones estén separadas por
o caracteres.
De nuevo: are separated by
El punto y coma entre bloques condicionales parece ser opcional; solo los puntos y comas entre declaraciones dentro los bloques parecen ser obligatorios:
$ echo -e "foonbar" | gawk '/foo/ print "foo found" /bar/ print "bar found"'
foo found
bar found
$ echo -e "foonbar" | gawk '/foo/ print "foo found" ; /bar/ print "bar found"'
foo found
bar found
$ echo -e "foonbar" | gawk '/foo/ print "foo found"; print "whee" '
foo found
whee
$ echo -e "foonbar" | gawk '/foo/ print "foo found" print "whee" '
gawk: cmd. line:1: /foo/ print "foo found" print "whee"
gawk: cmd. line:1: ^ syntax error
Sin embargo, cuando el bloque de código real entre dos condicionales se omite en favor del predeterminado (es decir, print
), el punto y coma se hace necesario:
$ echo -e "foonbar" | gawk '/foo/ /bar/'
gawk: cmd. line:2: /foo/ /bar/
gawk: cmd. line:2: ^ unexpected newline or end of string
$ echo -e "foonbar" | gawk '/foo/; /bar/'
foo
bar