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:
- Especificando la variable Archivo en la línea de mandatos.
- Modificando las variables especiales ARGV y ARGC.
- Suministrando entrada estándar en ausencia de la variable
Archivo.
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:
- Pueden imprimirse datos seleccionados en la salida estándar, sin alterar el archivo
de entrada.
- Pueden modificarse partes seleccionadas del archivo de entrada.
- Pueden modificarse datos seleccionados e imprimirse en la salida estándar, con o sin
alteración del contenido del archivo 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:
- 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.
- 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.
- 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.
- Si el registro coincide con un patrón, las acciones asociadas con dicho patrón se
realizan en el registro.
- 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.
- 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.
- 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:
- Los rangos se especifican mediante dos patrones separados por
una , (coma). Las acciones se realizan en todos los registros que empiezan por el
registro que coincide con el primer patrón, y continúan hasta el registro que coincide
con el segundo patrón inclusive. Por ejemplo:
/begin/,/end/
compara el registro que contiene la serie
begin y cada uno de los registros situados entre éste y el
registro
que contiene la serie end, incluido el registro que
contiene la serie end.
- Los paréntesis ( ) agrupan patrones.
- Los operadores booleanos || (o), && (y) y ! (no) combinan patrones en
expresiones que se comparan si se evalúan como true (verdadera); de lo
contrario, no se comparan.
Por ejemplo, el patrón:
$1 == "al" && $2 == "123"
compara registros en los que el primer campo es al y el segundo campo es 123.
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
- 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.
- Para visualizar todas las líneas entre las palabras start
y stop, incluidas "start"
y "stop", especifique:
awk '/start/,/stop/' chapter1
- 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.
- Para imprimir los dos primeros campos en orden opuesto,
especifique:
awk '{ print $2, $1 }' chapter1
- 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.