Mandato awk

Finalidad

Busca en archivos líneas coincidentes con un patrón y realiza acciones especificadas sobre dichas líneas.

Sintaxis

awk [ -FEre ] [ -v Asignación ] ... { -f ArchivoPrograma | 'Programa' } [ [ Archivo ... | Asignación ... ] ] ...

Descripción

El mandato awk utiliza un conjunto de instrucciones suministradas por usuario para comparar un conjunto de archivos, línea por línea, con expresiones regulares ampliadas suministradas por el usuario. A continuación, se realizan acciones sobre las líneas que coinciden con las expresiones regulares ampliadas.

La búsqueda de patrones del mandato awk es más genérica que la del mandato grep, y permite al usuario realizar varias acciones sobre las líneas de texto de entrada. El lenguaje de programación del mandato awk no requiere compilación y permite al usuario utilizar variables, funciones numéricas, funciones de tipo serie y operadores lógicos.

El mandato awk resulta afectado por las variables de entorno LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_NUMERIC, NLSPATH y PATH.

En este artículo se describen los temas siguientes:

Entrada del mandato awk

El mandato awk toma dos tipos de entrada: archivos de texto de entrada e instrucciones de programa.

Archivos de texto de entrada

La búsqueda y las acciones se realizan en archivos de texto de entrada. Los archivos se especifican:

Si se especifican varios archivos con la variable Archivo, los archivos se procesan en el orden especificado.

Instrucciones de programa

Instrucciones suministradas por el usuario que controlan las acciones del mandato awk. Estas instrucciones proceden de la variable `Programa' de la línea de mandatos o de un archivo especificado por el distintivo -f junto con la variable ArchivoPrograma. Si se especifican varios archivos de programa, los archivos se concatenan en el orden especificado y se utiliza el orden de instrucciones resultante.

Salida del mandato awk

El mandato awk produce tres tipos de salida desde los datos del archivo de texto de entrada:

Los tres tipos de salida pueden realizarse en el mismo archivo. El lenguaje de programación reconocido por el mandato awk permite al usuario redireccionar la salida.

Proceso de archivos con registros y campos

Los archivos se procesan del siguiente modo:

  1. El mandato awk explora sus instrucciones y ejecuta las acciones especificadas que deben producirse antes de que se lea el archivo de entrada.

    la sentencia BEGIN del lenguaje de programación de awk permite al usuario especificar un conjunto de instrucciones que deben realizarse antes de que se lea el primer registro. Esto es particularmente útil para inicializar variables especiales.

  2. Se lee un registro del archivo de entrada.

    Un registro es un conjunto de datos separado por un separador de registros. El valor predeterminado para el separador de registros es el carácter de línea nueva, que convierte a cada línea del archivo en un registro independiente. El separador de registros puede cambiarse estableciendo la variable especial RS.

  3. El registro se compara con cada uno de los patrones especificados por las instrucciones del mandato awk.

    Las instrucciones del mandato pueden especificar que debe compararse un campo determinado del registro. Por omisión, los campos están separados por espacios en blanco (blancos o tabulaciones). Una variable de campo hace referencia a cada uno de los campos. Al primer campo de un registro se le asigna la variable $1, al segundo campo se le asigna la variable $2, y así sucesivamente. Todo el registro se asigna a la variable $0. El separador de campos puede cambiarse mediante el distintivo -F en la línea de mandatos o estableciendo la variable especial FS. La variable especial FS puede establecerse en los siguientes valores: blanco, carácter único o expresión regular ampliada.

  4. Si el registro coincide con un patrón, las acciones asociadas con dicho patrón se realizan en el registro.
  5. Después de comparar el registro con cada patrón y de realizar todas las acciones especificadas, se lee el registro siguiente de la entrada; el proceso se repite hasta haber leído todos los registros del archivo de entrada.
  6. Si se han especificado varios archivos de entrada, a continuación se abre el próximo archivo y el proceso se repite hasta haber leído todos los archivos de entrada.
  7. Una vez leído el último registro del último archivo, el mandato awk ejecuta las instrucciones especificadas que deben realizarse después del proceso de la entrada.

    La sentencia END del lenguaje de programación de awk permite al usuario especificar acciones que deben realizarse después de leer el último registro. Esto es especialmente útil para enviar mensajes acerca del trabajo realizado por el mandato awk.

El lenguaje de programación del mandato awk

El lenguaje de programación del mandato awk consta de sentencias con el siguiente formato:

Patrón { Acción }

Si un registro coincide con el patrón especificado o contiene un campo que coincide con el patrón, se realiza la acción especificada. Un patrón puede especificarse sin ninguna acción, en cuyo caso toda la línea que contiene el patrón se graba en la salida estándar. Una acción especificada sin un patrón se realiza en todos los registros de entrada.

Patrones

Existen cuatro tipos de patrones utilizados en la sintaxis del lenguaje del mandato awk:

Expresiones regulares

Las expresiones regulares ampliadas utilizadas por el mandato awk son parecidas a las utilizadas por el mandato grep. La forma más simple de una expresión regular ampliada es una serie de caracteres entre barras inclinadas. Por ejemplo, supongamos que un archivo denominado testfile tiene el contenido siguiente:

smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis

Especificando lo siguiente en la línea de mandatos:

awk '/smi/' testfile

se imprimirán en la salida estándar todos los registros que contienen una aparición de la serie smi. En este ejemplo, el programa '/smi/' para el mandato awk es un patrón sin acción. La salida es:

smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis

Para formar expresiones regulares ampliadas se utilizan los siguientes caracteres especiales:

Carácter Función
+ Especifica que una serie coincide si una o varias apariciones del carácter o expresión regular ampliada que precede al + (signo más) se encuentran dentro de la serie. La línea de mandatos:

awk '/smith+ern/' testfile

imprimirá en la salida estándar los registros que contienen una serie con los caracteres smit, seguidos de uno o varios caracteres h y terminando con los caracteres ern. La salida de este ejemplo es:

smithern, harry
smithhern, anne
? Especifica que una serie coincide si cero o varias apariciones del carácter o expresión regular ampliada que precede al ? (signo de interrogación) se encuentran dentro de la serie. La línea de mandatos:

awk '/smith?/' testfile

imprime en la salida estándar todos los registros que contienen los caracteres smit, seguidos de cero o una instancia del carácter h. La salida de este ejemplo es:

smith, alan
smithern, harry
smithhern, anne
smitters, alexis
| Especifica que una serie coincide si alguna de las series separadas por el carácter | (barra vertical) se encuentra dentro de la serie. La línea de mandatos:

awk '/allen 
| 
alan /' testfile

imprimirá en la salida estándar todos los registros que contengan las series allen o alan. La salida de este ejemplo es:

smiley, allen
smith, alan
( ) Agrupa series en expresiones regulares. La línea de mandatos:

awk '/a(ll)?(nn)?e/' testfile

imprime en salida estándar todos los registros con la serie ae, alle, anne o allnne. La salida de este ejemplo es:

smiley, allen
smithhern, anne
{m} Especifica que una serie coincide si exactamente m apariciones del patrón se encuentran dentro de la serie. La línea de mandatos:

awk '/l{2}/' testfile

imprime en salida estándar

smiley, allen
{m,} Especifica que una serie coincide si como mínimo m apariciones del patrón se encuentran dentro de la serie. La línea de mandatos:

awk '/t{2,}/' testfile

imprime en salida estándar:

smitters, alexis
{m, n} Especifica que una serie coincide si entre m y n apariciones inclusive del patrón se encuentran dentro de la serie (siendo m <= n). La línea de mandatos:

awk '/er{1, 2}/' testfile

imprime en salida estándar:

smithern, harry
smithern, anne
smitters, alexis
[Serie] Significa que la expresión regular se compara con los caracteres especificados por la variable Serie dentro de los corchetes. La línea de mandatos:

awk '/sm[a-h]/' testfile

imprime en salida estándar todos los registros con los caracteres sm seguidos de cualquier carácter por orden alfabético desde a hasta h. La salida de este ejemplo es:

smawley, andy
[^ Serie] Un carácter ^ (marca de intercalación) dentro de [ ] (corchetes cuadrados) y al principio de la serie especificada indica que la expresión regular no coincide con ningún carácter incluido en los corchetes cuadrados. Por tanto, la línea de mandatos:

awk '/sm[^a-h]/' testfile

imprime en salida estándar:

smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
~,!~ Indica una sentencia condicional que una variable especificada compara (tilde) o no compara (tilde, signo de admiración) con la expresión regular. La línea de mandatos:

awk '$1 ~ /n/' testfile

imprime en salida estándar todos los registros cuyo primer campo contiene el carácter n. La salida de este ejemplo es:

smithern, harry
smithhern, anne
^ Indica el principio de un campo o registro. La línea de mandatos:

awk '$2 ~ /^h/' testfile

imprime en salida estándar todos los registros con el carácter h como primer carácter del segundo campo. La salida de este ejemplo es:

smithern, harry
$ Indica el final de un campo o registro. La línea de mandatos:

awk '$2 ~ /y$/' testfile

imprime en salida estándar todos los registros con el carácter y como último carácter del segundo campo. La salida de este ejemplo es:

smawley, andy
smithern, harry
. (punto) Indica cualquier carácter excepto el carácter final de línea nueva al final de un espacio. La línea de mandatos:

awk '/a..e/' testfile

imprime en salida estándar todos los registros con los caracteres a y e separados por dos caracteres. La salida de este ejemplo es:

smawley, andy
smiley, allen
smithhern, anne
*(asterisco) Indica cero o más caracteres cualesquiera. La línea de mandatos:

awk '/a.*e/' testfile

imprime en salida estándar todos los registros con los caracteres a y e separados por cero o más caracteres. La salida de este ejemplo es:

smawley, andy
smiley, allen
smithhern, anne
smitters, alexis
\ (barra inclinada invertida) El carácter de escape. Si precede a cualquiera de los caracteres que tienen significado especial en las expresiones regulares ampliadas, el carácter de escape elimina dicho significado especial del carácter. Por ejemplo, la línea de mandatos:

/a\/\//

comparará el patrón con //, ya que las barras inclinadas invertidas niegan el significado habitual de la barra como delimitador de la expresión regular. Para especificar la propia barra inclinada invertida como carácter, utilice una doble barra inclinada invertida. Consulte el elemento siguiente acerca de las secuencias de escape para obtener más información sobre la barra inclinada invertida y sus usos.

Secuencias de escape reconocidas

El mandato awk reconoce la mayoría de las secuencias de escape utilizadas en los convenios del lenguaje C, así como varias de las utilizadas como caracteres especiales por el propio mandato awk. Las secuencias de escape son las siguientes:

Secuencia de escape Carácter representado
\" \" (comillas)
\/ / (barra inclinada)
\ddd Carácter cuya codificación se representa mediante un entero octal de uno, dos o tres dígitos, donde d representa un dígito octal
\\ \ (barra inclinada)
\a Carácter de Alerta
\b Carácter de retroceso
\f Carácter de salto de página
\n Carácter de línea nueva (ver nota siguiente)
\r Carácter de retorno de carro
\t Carácter de tabulación
\v Tabulación vertical.
Nota:
Excepto en las funciones incorporadas gsub, match, split y sub, la comparación de expresiones regulares ampliadas se basa en registros de entrada. Los caracteres separadores de registros (por omisión, los caracteres de línea nueva) no pueden estar intercalados en la expresión, y ninguna expresión se compara con el carácter separador de registros. Si el separador de registros no es el carácter de línea nueva, éste puede compararse. En las cuatro funciones incorporadas especificadas, la comparación se basa en series de texto, y cualquier carácter (incluido el separador de registros) puede estar intercalado en el patrón a fin de que éste se compare con el carácter adecuado. Sin embargo, en todas las expresiones regulares coincidentes con el mandato awk, el uso de uno o más caracteres NULOS en el patrón produce resultados indefinidos.

Expresiones relacionales

Los operadores relacionales < (menor que), > (mayor que), <= (menor o igual que), >= (mayor o igual que), = = (igual a) y ! = (no igual a) pueden utilizarse para formar patrones. Por ejemplo, el patrón:

$1 < $4

compara registros en los que el primer campo es menor que el cuarto campo. Los operadores relacionales también funcionan con valores tipo serie. Por ejemplo:

$1 =! "q"

compara todos los registros en los que el primer campo no es una q. Los valores tipo serie también pueden compararse en valores de clasificación. Por ejemplo:

$1 >= "d"

compara todos los registros en los que el primer campo empieza por un carácter que es a, b, c o d. Si no se suministra otra información, las variables de campo se comparan como valores tipo serie.

Combinaciones de patrones

Los patrones pueden combinarse mediante tres opciones:

Patrones BEGIN y END

Las acciones especificadas con el patrón BEGIN se realizan antes de leer ninguna entrada. Las acciones especificadas con el patrón END se realizan después de leer toda la entrada. Se permiten varios patrones BEGIN y END, que se procesan en el orden especificado. Un patrón END puede preceder a un patrón BEGIN en las sentencias de programa. Si un programa sólo consta de sentencias BEGIN, las acciones se realizan y no se lee ninguna entrada. Si un programa sólo consta de sentencias END, se lee toda la entrada antes de realizar ninguna acción.

Acciones

Hay varios tipos de sentencias de acción:

Sentencias de acción

Las sentencias de acción están incluidas entre { } (llaves). Si las sentencias se especifican sin un patrón, se realizan en todos los registros. Pueden especificarse varias acciones entre las llaves, pero deben estar separadas por caracteres de línea nueva o ; (signos de punto y coma); las sentencias se procesarán en el orden de aparición. Las sentencias de acción pueden ser:

Sentencias aritméticas
Los operadores matemáticos + (más), - (menos), / (división), ^ (exponenciación), * (multiplicación), % (módulo) se utilizan con el formato:

Expresión Operador
Expresión

Por tanto, la sentencia:

$2 = $1 ^3

asigna el valor del primer campo elevado a la tercera potencia del segundo campo.

Sentencias Unary
Las sentencias unary - (minus) y unary + (plus) funcionan como en el lenguaje de programación C:

+Expresión o
-Expresión
Sentencias de incremento y decremento
Las sentencias de preincremento y predecremento funcionan como en el lenguaje de programación C:

++Variable o --Variable

Las sentencias de postincremento y postdecremento funcionan como en el lenguaje de programación C:

Variable++ o Variable--
Sentencias de asignación
Los operadores de asignación += (adición), -= (sustracción), /= (división) y *= (multiplicación) funcionan como en el lenguaje de programación C, con el formato:

Variable += Expresión

Variable -= Expresión

Variable /= Expresión

Variable *= Expresión

Por ejemplo, la sentencia:

$1 *= $2

multiplica la variable de campo $1 por la variable de campo $2 y luego asigna el valor nuevo a $1.

Los operadores de asignación ^= (exponenciación) y %= (módulo) tienen el formato:

Variable1^=Expresión1

Y

Variable2%=Expresión2

y son equivalentes a las sentencias del lenguaje de programación C:

Variable1=pow(Variable1, Expresión1)

Y

Variable2=fmod(Variable2, Expresión2)

donde pow es la subrutina pow y fmod es la subrutina fmod.

Sentencias de concatenación de series
Los valores de tipo serie pueden concatenarse colocándolos uno junto a otro. Por ejemplo:

$3 = $1 $2

asigna la concatenación de las series de las variables de campo $1 y $2 a la variable de campo $3.

Funciones incorporadas

El lenguaje del mandato awk utiliza funciones aritméticas, funciones de serie y funciones generales. Es necesaria la sentencia de subrutina close si tiene previsto grabar un archivo y leerlo más tarde en el mismo programa.

Funciones aritméticas

Las funciones aritméticas que siguen realizan las mismas acciones que las subrutinas del lenguaje C del mismo nombre:

Función Acción
atan2( y, x ) Devuelve el arcotangente de y/x.
cos( x ) Devuelve el coseno de x; x se expresa en radianes.
sin( x ) Devuelve el seno de x; x se expresa en radianes.
exp( x ) Devuelve la función exponencial de x.
log( x ) Devuelve el logaritmo natural de x.
sqrt( x ) Devuelve la raíz cuadrada de x.
int( x ) Devuelve el valor de x truncado en un entero.
rand( ) Devuelve un número aleatorio n, con 0 <= n < 1.
srand( [Expr] ) Establece el valor inicial de la función rand en el valor del parámetro Expr, o se utiliza la hora del día si se omite el parámetro Expr. Se devuelve el valor inicial anterior.
Funciones de serie

Las funciones de serie son las siguientes:

Función Acción
gsub( Ere, Repl, [ In ] ) Funciona exactamente igual que la función sub, excepto que se sustituyen todas las apariciones de la expresión regular.
sub( Ere, Repl, [ In ] ) Sustituye la primera aparición de la expresión regular ampliada especificada por el parámetro Ere en la serie especificada por el parámetro In por la serie especificada por el parámetro Repl. La función sub devuelve el número de sustituciones. Si aparece un símbolo & (ampersand) en la serie especificada por el parámetro Repl, se sustituye por la serie del parámetro In que coincide con la expresión regular ampliada especificada por el parámetro Ere. Si no se especifica ningún parámetro In, el valor predeterminado es todo el registro (la variable de registro $0).
index( Serie1, Serie2 ) Devuelve la posición, numerada a partir de 1, dentro de la serie especificada por el parámetro Serie1 en la que se encuentra la serie especificada por el parámetro Serie2. Si el parámetro Serie2 no se encuentra en el parámetro Serie1, se devuelve 0 (cero).
length [(Serie)] Devuelve la longitud, en caracteres, de la serie especificada por el parámetro Serie. Si no se suministra ningún parámetro Serie, se devuelve la longitud de todo el registro (la variable de registro $0).
blength [(Serie)] Devuelve la longitud, en bytes, de la serie especificada por el parámetro Serie. Si no se suministra ningún parámetro Serie, se devuelve la longitud de todo el registro (la variable de registro $0).
substr( Serie, M, [ N ] ) Devuelve una subserie con el número de caracteres especificados por el parámetro N. La subserie se toma de la serie especificada por el parámetro Serie, a partir del carácter situado en la posición especificada por el parámetro M. El parámetro M se especifica con el primer carácter del parámetro Serie como número 1. Si no se especifica el parámetro N, la subserie será desde la posición especificada por el parámetro M hasta el final del parámetro Serie.
match( Serie, Ere ) Devuelve la posición, numerada a partir de 1, dentro de la serie especificada por el parámetro Serie en la que se encuentra la expresión regular ampliada especificada por el parámetro Ere; de lo contrario, devuelve 0 (cero) si el parámetro Ere no está presente. La variable especial RSTART se establece en el valor de retorno. La variable especial RLENGTH se establece en la longitud de la serie coincidente, o en -1 (uno negativo) si no se encuentra ninguna coincidencia.
split( Serie, A, [Ere] ) Divide la serie especificada por el parámetro Serie en elementos de matriz A[1], A[2], . . ., A[n], y devuelve el valor de la variable n. La separación se realiza con la expresión regular ampliada especificada por el parámetro Ere o con el separador de campos actual (la variable especial FS) si no se especifica el parámetro Ere. Los elementos de la matriz A se crean con valores de serie, a menos que el contexto indique que un elemento determinado debe tener también un valor numérico.
tolower( Serie ) Devuelve la serie especificada por el parámetro Serie, pasando a minúsculas cada uno de los caracteres en mayúsculas de la serie. La correlación entre mayúsculas y minúsculas se define en la categoría LC_CTYPE del entorno nacional actual.
toupper( Serie ) Devuelve la serie especificada por el parámetro Serie, pasando a mayúsculas cada uno de los caracteres en minúsculas de la serie. La correlación entre mayúsculas y minúsculas se define en la categoría LC_CTYPE del entorno nacional actual.
sprintf(Formato, Expr, Expr, . . . ) Formatea las expresiones especificadas por los parámetros Expr de acuerdo con la serie de formato de la subrutina printf especificada por el parámetro Formato y devuelve la serie resultante.
Funciones generales

Las funciones generales son las siguientes:

Función Acción
close( Expresión ) Cierra el archivo o conducto abierto por una sentencia print o printf o una llamada a la función getline con el mismo valor de serie para el parámetro Expresión. Si el archivo o conducto se ha cerrado satisfactoriamente, se devuelve 0; de lo contrario, se devuelve un valor no cero. Es necesaria la sentencia close si tiene previsto grabar un archivo y leerlo más tarde en el mismo programa.
system(Mandato ) Ejecuta el mandato especificado por el parámetro Mandato y devuelve su estado de salida. Equivalente a la subrutina system.
Expresión | getline [ Variable ] Lee un registro de entrada de una corriente de datos conducida desde la salida de un mandato especificado por el parámetro Expresión y asigna el valor del registro a la variable especificada por el parámetro Variable. La corriente se crea si no hay actualmente ninguna corriente abierta con el valor del parámetro Expresión como su nombre de mandato. La corriente creada es equivalente a la creada por una llamada a la subrutina popen con el parámetro Mandato tomando el valor del parámetro Expresión y el parámetro Modalidad establecido en el valor de r. Cada llamada subsiguiente a la función getline lee otro registro, siempre y cuando la corriente permanezca abierta y el parámetro Expresión produzca la misma serie. Si no se especifica un parámetro Variable, la variable de registro $0 y la variable especial NF es establecen en el registro leído desde la corriente.
getline [ Variable ] < Expresión Lee el próximo registro de entrada del archivo indicado por el parámetro Expresión y establece variable especificada por el parámetro Variable en el valor del registro. Cada llamada subsiguiente a la función getline lee otro registro, siempre y cuando la corriente permanezca abierta y el parámetro Expresión produzca la misma serie. Si no se especifica un parámetro Variable, la variable de registro $0 y la variable especial NF es establecen en el registro leído desde la corriente.
getline [ Variable ] Establece variable especificada por el parámetro Variable en el próximo registro de entrada del archivo de entrada actual. Si no se especifica ningún parámetro Variable, la variable de registro $0 se establece en el valor del registro y también se establecen las variables especiales NF, NR y FNR.
Nota:
Todos los formatos de la función getline devuelven 1 para una entrada satisfactoria, cero para fin de archivo y -1 para un error.

Funciones definidas por usuario

Las funciones definidas por usuario se declaran del siguiente modo:

function Nombre (Parámetro, Parámetro,...)  { Sentencias }

En cualquier lugar de un programa de mandato awk puede hacerse referencia a una función, y su utilización puede preceder a su definición. El ámbito de la función es global.

Los parámetros de la función pueden ser escalares o matrices. Los nombres de parámetro son locales con respecto a la función; todos los demás nombres de variable son globales. No debe utilizarse el mismo nombre para entidades diferentes; por ejemplo, un nombre de parámetro no debe estar duplicado como nombre de función o variable especial. Las variables con ámbito global no deben compartir el nombre de una función. Los escalares y matrices no deben tener el mismo nombre en el mismo ámbito.

El número de parámetros de la definición de función no tiene que coincidir con el número de parámetros utilizados al llamar a la función. Pueden utilizarse parámetros formales adicionales como variables locales. Los parámetros escalares adicionales se inicializan con un valor de serie equivalente a la serie vacía y un valor numérico de 0 (cero); los parámetros de matriz adicionales se inicializan como matrices vacías.

Al invocar una función, no se coloca ningún espacio en blanco entre el nombre de la función y el paréntesis de apertura. Las llamadas de función pueden ser anidadas y recursivas. En el retorno de una llamada de función anidada o recursiva, los valores de todos los parámetros de la función llamante permanecerán sin cambios, excepto los parámetros de matriz pasados por referencia. Puede utilizarse la sentencia return para devolver un valor.

Dentro de una definición de función, son opcionales los caracteres de nueva línea antes de la { (llave) de apertura y después de la } (llave) de cierre.

A continuación figura un ejemplo de definición de función:

function average ( g,n) 
  {
        for (i in g)
           sum=sum+g[i]
        avg=sum/n
        return avg
  } 

Se pasa una matriz a la función average, g, y una variable, n, con el número de elementos de la matriz. A continuación, la función obtiene un promedio (average) y lo devuelve.

Sentencias condicionales

la mayoría de sentencias condicionales del lenguaje de programación del mandato awk tienen la misma sintaxis y funcionamiento que las sentencias condicionales del lenguaje de programación C. Todas las sentencias condicionales permiten el uso de { } (llaves) para agrupar sentencias. Puede utilizarse una nueva línea opcional entre la parte de expresión y la parte de sentencia de la sentencia condicional, y se utilizan nuevas líneas o ; (punto y coma) para separar varias sentencias en { } (llaves). Las seis sentencias condicionales del lenguaje C son:

Sentencia condicional Sintaxis necesaria o descripción
if

if ( Expresión ) { Sentencia [ else Acción ]

while

while ( Expresión ) { Sentencia }

for

for ( Expresión ; Expresión ; Expresión ) { Sentencia }

break Provoca la salida del bucle de programa cuando se utiliza la sentencia break en una sentencia while o for.
continue Provoca el movimiento del bucle de programa a la próxima iteración cuando se utiliza la sentencia continue en una sentencia while o for.

Las cinco sentencias condicionales del lenguaje de programación del mandato awk que no siguen las normas del lenguaje C son:

Sentencia condicional Sintaxis necesaria o descripción
for...in

for ( Variable in Matriz ) { Sentencia }

La sentencia for...in establece el parámetro Variable en cada valor de índice de la variable Matriz, un índice cada vez y sin un orden determinado, y realiza la acción especificada por el parámetro Sentencia con cada iteración. Consulte la sentencia delete para obtener un ejemplo de una sentencia for...in.

if...in

if ( Variable in Matriz ) { Sentencia }

La sentencia if...in comprueba la existencia del elemento Matriz. La sentencia se ejecuta si se encuentra el elemento Matriz.

delete

delete Matriz [ Expresión ]

La sentencia delete suprime tanto el elemento de matriz especificado por el parámetro Matriz como el índice especificado por el parámetro Expresión. Por ejemplo, las sentencias:

for (i in g)
   delete g[i];

suprimirán todos los elementos de la matriz g[].

exit

exit [ Expresión ]

La sentencia exit invoca primero todas las acciones END en el orden en que se producen y, a continuación, termina el mandato awk con el estado de salida especificado por el parámetro Expresión. No se invocan acciones END subsiguientes si la sentencia exit se ejecuta dentro de una acción END.

#

# Comentario

La sentencia # coloca comentarios. Los comentarios deben terminar siempre con una nueva línea, pero pueden empezar en cualquier lugar de una línea.

next Detiene el proceso del registro de entrada actual y continúa con el registro de entrada siguiente.

Sentencias de salida

Las dos sentencias de salida del lenguaje de programación del mandato awk son:

Sentencia de salida Sintaxis y descripción
print

print [ ListaExpresiones ] [ Redirección ] [ Expresión ]

La sentencia print graba el valor de cada expresión especificada por el parámetro ListaExpresiones en la salida estándar. Cada expresión está separada por el valor actual de la variable especial OFS y cada registro queda terminado por el valor actual de la variable especial ORS.

La salida puede redireccionarse mediante el parámetro Redirección, que puede especificar las tres redirecciones de salida con los signos > (mayor que), >> (doble mayor que) y | (barra vertical). El parámetro Redirección especifica cómo se redicciona la salida y el parámetro Expresión es un nombre de vía de acceso a un archivo (cuando el parámetro Redirección es > o >> ) o el nombre de un mandato (cuando el parámetro Redirección es | ).

printf

printf Formato [ , ListaExpresiones ] [ Redirección ] [ Expresión ]

La sentencia printf graba en la salida estándar las expresiones especificadas por el parámetro ListaExpresiones en el formato especificado por el parámetro Formato. La sentencia printf funciona exactamente igual que el mandato printf, excepto en la especificación de la conversión c (%c). Los parámetros Redirección y Expresión funcionan igual que en la sentencia print.

Para la especificación de la conversión c: si el argumento tiene un valor numérico, la salida será el carácter cuya codificación tiene ese valor. Si el valor es cero o no es la codificación de ningún carácter del juego de caracteres, el comportamiento es indefinido. Si el argumento no tiene un valor numérico, la salida será el primer carácter del valor de la serie; si la serie no contiene caracteres, el comportamiento es indefinido.

Nota:
Si el parámetro Expresión especifica un nombre de vía de acceso para el parámetro Redirección, el parámetro Expresión debe especificarse entre comillas para garantizar que se trate como si fuere una serie.

Variables

Las variables pueden ser escalares, variables de campo, matrices o variables especiales. Los nombres de variable no pueden empezar con un dígito.

Las variables pueden utilizarse haciendo referencia a ellas. Con la excepción de los parámetros de función, no se declaran explícitamente. Las variables escalares no inicializadas y los elementos de matriz tienen un valor numérico 0 (cero) y un valor de serie de serie nula (" ").

Las variables toman valores numéricos o de tipo serie según el contexto. Cada variable puede tener un valor numérico, un valor de serie o ambos. Por ejemplo:

x = "4" + "8"

asigna el valor 12 a la variable x. Para constantes tipo serie, las expresiones deben especificarse entre " " (comillas).

No existen conversiones explícitas entre números y series. Para obligar a que una expresión se trate como un número, añádale 0 (cero). Para obligar a que una expresión se trate como una serie, añada una serie nula (" ").

Variables de campo

Las variables de campo se designa mediante un $ (signo de dólar) seguido de un número o expresión numérica. Al primer campo de un registro se le asigna la variable $1, al segundo campo se le asigna la variable $2, y así sucesivamente. La variable especial $0 se asigna a todo el registro. Pueden crearse variables de campo nuevas asignándoles un valor. Asignar un valor a un campo inexistente, es decir, a cualquier campo más grande que el valor actual de la variable de campo $NF, fuerza la creación de los campos intervinientes (establecidos en la serie nula), aumenta el valor de la variable especial NF y fuerza la recalculación del valor de la variable de registro $0. Los campos nuevos están separados por el separador de campos actual (que es el valor de la variable especial FS). Blancos y tabulaciones son los separados de campos predeterminados. Para cambiar el separador de campos, utilice el distintivo -F o asigne a la variable especial FS un valor diferente en el programa del mandato awk.

Matrices

Las matrices están vacías inicialmente y su tamaño cambia dinámicamente. Las matrices se representan mediante una variable con subíndices en [ ] (corchetes cuadrados). Los subíndices, o identificadores de elementos, pueden ser números de series, que proporcionan un tipo de posibilidad de matrices asociativas. Por ejemplo, el programa:

/red/  { x["red"]++ }
/green/ { y["green"]++ }

incrementa las cuentas del contador red y del contador green.

Las matrices pueden indexarse con más de un subíndice, de forma similar a las matrices multidimensionales en algunos lenguajes de programación. Dado que las matrices de programación del mandato awk son en realidad unidimensionales, los subíndices separados por comas se convierten a una sola serie concatenando los valores de serie de las expresiones separadas, con cada expresión separada por el valor de la variable de entorno SUBSEP. Por tanto, las dos operaciones de índice siguientes son equivalentes:

x[expr1, expr2,...exprn]

Y

x[expr1SUBSEPexpr2SUBSEP...SUBSEPexprn]

Al utilizar el operador in, un valor multidimensional Índice debe especificarse entre paréntesis. Excepto en el caso del operador in, cualquier referencia a un elemento de matriz inexistente crea automáticamente dicho elemento.

Variables especiales

Las variables siguientes tienen un significado especial para el mandato awk:

Variable especial Descripción
ARGC El número de elementos de la matriz ARGV. Este valor puede modificarse.
ARGV La matriz con cada miembro que contiene una de las variables Archivo o Asignación, tomadas por orden desde la línea de mandatos y numeradas de 0 (cero) a ARGC -1. Cuando termina cada uno de los archivos de entrada, el próximo miembro de la matriz ARGV proporciona el nombre del próximo archivo de entrada, a menos que:
  • El próximo miembro sea una sentencia de Asignación, en cuyo caso la asignación se evalúa.
  • El próximo miembro tenga un valor nulo, en cuyo caso el miembro se pasa por alto. Los programas pueden pasar por alto archivos de entrada seleccionados estableciendo en un valor nulo el miembro de la matriz ARGV que contiene dicho archivo.
  • El próximo miembro sea el valor actual de ARGV [ARGC -1], que el mandato awk interpreta como el final de los archivos de entrada.
CONVFMT El formato de printf para la conversión de números en series (excepto para sentencias de salida, en las que se utiliza la variable especial OFMT). El valor predeterminado es "%.6g".
ENVIRON Matriz que representa el entorno bajo el que opera el mandato awk. cada elemento de la matriz tiene el formato:

ENVIRON [ "NombreVariableEntorno" ] = ValorVariableEntorno

Los valores se establecen cuando el mandato awk inicia la ejecución, y ese entorno se utiliza hasta al final de la ejecución, independientemente de las modificaciones de la variable especial ENVIRON.

FILENAME Nombre de vía de acceso del archivo de entrada actual. Durante la ejecución de una acción BEGIN, el valor de FILENAME es indefinido. Durante la ejecución de una acción END, el valor es el nombre del último archivo de entrada procesado.
FNR Número del registro de entrada actual en el archivo actual.
FS Separador de campos de entrada. El valor predeterminado es un espacio en blanco. Si el separador de campos de entrada es un espacio en blanco, cualquier número de espacios definidos por entorno nacional puede separar campos. La variable especial FS puede tomar dos valores adicionales:
  • Con FS establecido en un solo carácter, los campos se separan mediante cada aparición del carácter.
  • Con FS establecido en una expresión regular ampliada, cada aparición de una secuencia que coincida con la expresión regular ampliada separa los campos.
NF Número de campos del registro actual, con un límite de 99. Dentro de una acción BEGIN, la variable especial NF es indefinida a menos que se haya emitido anteriormente una función getline sin un parámetro Variable. Dentro de una acción END, la variable especial NF conserva el valor que tenía para el último registro leído, a menos que se haya emitido una función getline subsiguiente redireccionada sin un parámetro Variable antes de especificar la acción END.
NR Número del registro de entrada actual. Dentro de una acción BEGIN, el valor de la variable especial NR es 0 (cero). Dentro de una acción END, el valor es el número del último registro procesado.
OFMT El formato de printf para la conversión de números en series en sentencias de salida. El valor predeterminado es "%.6g".
OFS Separador de campos de salida (el valor predeterminado es un espacio).
ORS Separador de registros de salida (el valor predeterminado es un carácter de nueva línea).
RLENGTH Longitud de la serie comparada por la función match.
RS Separador de registros de entrada (el valor predeterminado es un carácter de nueva línea). Si la variable especial RS es nula, los registros se separan mediante secuencias de una o más líneas en blanco; las líneas en blanco iniciales o finales no provocan registros vacíos al principio al al final de la entrada; y el carácter de nueva línea es siempre un separador de campos, independientemente del valor de la variable especial FS.
RSTART Posición inicial de la serie comparada por la función match, numerada a partir de 1. Equivalente al valor de retorno de la función match.
SUBSEP Separa varios subíndices. El valor predeterminado es \031.

Distintivos

-f ArchivoPrograma Obtiene instrucciones para el mandato awk del archivo especificado por la variable ArchivoPrograma. Si el distintivo -f se especifica varias veces, la concatenación de los archivos, en el orden especificado, se utilizará como conjunto de instrucciones.
-F Ere Utiliza la expresión regular ampliada especificada por la variable Ere como separador de campos. El separador de campos predeterminado es un espacio en blanco.
-v Asignación Asigna un valor a una variable para el lenguaje de programación del mandato awk. El parámetro Asignación tiene el formato Nombre = Valor. La parte Nombre especifica el nombre de la variable y puede ser cualquier combinación de subrayados, dígitos y caracteres alfabéticos, pero debe empezar por un carácter alfabético o un subrayado. La parte Valor también se compone de subrayados, dígitos y caracteres alfabéticos, y se trata como si estuviera precedida y seguida de " (comillas), de forma similar a un valor de tipo serie. Si la parte Valor es numérica, la variable también recibirá el valor numérico.

La asignación especificada por el distintivo -v tiene lugar antes que se ejecute cualquier parte del programa del mandato awk, incluida la sección BEGIN.

Asignación Asigna un valor a una variable para el lenguaje de programación del mandato awk. Tiene el mismo formato y funcionamiento que la variable Asignación con el distintivo -v, excepto por el momento en que se procesan. El parámetro Asignación se procesa justo antes del archivo de entrada (especificado por la variable Archivo variable) que lo sigue en la línea de mandatos. Si el parámetro Asignación se especifica justo antes del primero de varios archivos de entrada, las asignaciones se procesan justo después de las secciones BEGIN (si existen). Si un parámetro Asignación figura después del último archivo, la asignación se procesa antes que las secciones END (si existen). Si no se especifican archivos de entrada, las asignaciones se procesan a medida que se lee la entrada estándar.
Archivo Especifica el nombre del archivo que contiene la entrada del proceso. Si no se especifica la variable Archivo o si se especifica un signo - (menos), se procesa la entrada estándar.
'Programa' Contiene las instrucciones para el mandato awk. Si no se especifica el distintivo -f, la variable Programa debe ser el primer elemento de la línea de mandatos. Debe especificarse entre ' ' (apóstrofos).

Estado de salida

Este mandato devuelve los siguientes valores de salida:

0 Finalización satisfactoria.
>0 Se ha producido un error.

Ejemplos

  1. Para visualizar las líneas de un archivo superiores a 72 caracteres, especifique:

    awk  'length  >72'  chapter1

    Con ello seleccionará cada línea del archivo chapter1 que sea superior a 72 caracteres y grabará estas líneas en la salida estándar, ya que no se ha especificado ninguna Acción. Un carácter de tabulación se cuenta como 1 byte.

  2. Para visualizar todas las líneas entre las palabras start y stop, incluidas "start" y "stop", especifique:

    awk  '/start/,/stop/'  chapter1
  3. Para ejecutar un programa de mandato awk, sum2.awk, que procese el archivo chapter1, especifique:

    awk  -f  sum2.awk  chapter1

    El programa que sigue, sum2.awk, calcula la suma y el promedio de los números de la segunda columna del archivo de entrada, chapter1:

        {
           sum += $2
        }
    END {
           print "Sum: ", sum;
           print "Average:", sum/NR;
        }

    La primera acción añade el valor del segundo campo de cada línea a la variable sum. Todas las variables se inicializan en el valor numérico 0 (cero) cuando se referencia por primera vez. El patrón END antes de la segunda acción provoca la ejecución de esas acciones después de haber leído todo el archivo de entrada. La variable especial NR, que se utiliza para calcular el promedio, es una variable especial que especifica el número de registros que se han leído.

  4. Para imprimir los dos primeros campos en orden opuesto, especifique:

    awk '{ print $2, $1 }' chapter1
  5. El programa awk que sigue,
    awk -f sum3.awk chapter2
    
    imprime los dos primeros campos del archivo chapter2 con los campos de entrada separados por comas y/out blancos y tabulaciones y, a continuación, añade la primera columna e imprime la suma y el promedio:
    BEGIN  {FS = ",|[ \t]+"}
           {print $1, $2}
           {s += $1}
    END    {print "sum is",s,"average is", s/NR }               

Información relacionada

Los mandatos grep y sed.


Enviar comentarios |  Valorar esta página