Cambiando los contenidos de un campo AWK

Puedes cambiar los contenidos de un campo dentro de un programa awk; estos cambios que awk percibe como el registro de entrada actual (La entrada real es intocable: awk nunca modifica el fichero de entrada). Mire este ejemplo:

awk '{ $3 = $2 - 10; print $2, $3 }' inventario-enviado

El signo ‘-‘ representa la substracción, de modo que este programa reasigna el campo tres, $3, y le da el valor del campo 2 menos el campo décimo, $2 - $10. El campo dos, y el nuevo valor del campo tres son impresos.
Para poder realizar esta operación, el texto del campo dos debe ser susceptible a ser convertido a número, la cadena de caracteres debe ser convertida a número para que se puede realizar la operación aritmética sobre dicho campo. El número resultante de la sustracción se convierte de nuevo a cadena de caracteres cuando se convierte en el campo tercero.
Cuando cambias el valor de un campo (como es percibido por awk), el texto del registro de entrada es recalculado para contener el nuevo campo en la posición en la que estaba el antiguo. Por lo tanto, $0 cambia para reflejar el campo alterado. Por lo que,

awk '{ $2 = $2 - 10; print $0 }' inventario-enviado

imprime una copia del fichero de entrada, restándole 10 unidades a cada uno de los valores que presenta el campo 2 para todas las líneas.
También puedes asignar contenidos a campos que están fuera del rango. Por ejemplo:

awk '{ $6 = ($5 + $4 + $3 + $2) ; print $6 }' inventario-enviado

acabamos de crear el campo $6, cuyo valor es la suma de los campos $2, $3, $4, y $5. El signo ‘+’ representa la suma. Para el fichero ‘inventario-enviado’, $6 representa el número total de objetos embarcados para un mes en particular.

La creación de un nuevo campo cambia la copia interna del registro de entrada actual que tiene awk – el valor de $0. Por lo que, si realiza un ‘print $0’ después de añadir un campo, el registro impreso incluye el nuevo campo, con el número de separadores de campo apropiado entre el nuevo campo y los campos existentes previamente.

Esta recomputación afecta y se ve afectada por varias características todavía no discutidas, en particular, el separador de campos de salida, OFS, que se usa para separar los campos, y NF (el número de campos). Por ejemplo, el valor de NF se fija al número del campo mayor que hayas creado.

Anotar, sin embargo, que referenciar a un campo fuera de rango no cambia ni el valor de $0 ni el de NF. El referenciar a un campo fuera de rango produce simplemente una cadena nula. Por ejemplo:

if ($(NF+1) != "")

print "no puede ocurrir" else
print "todo es normal"

imprimiría `todo es normal', ya que NF+1 está fuera de rango ciertamente.

Publicar un comentario

0 Comentarios