AWK

AWK ye un llinguaxe de programación diseñáu pa procesar datos basaos en testu, yá seyan ficheros o fluxos de datos. El nome AWK deriva de les iniciales de los apellíos de los sos autores: Alfred Aho, Peter Weinberger, y Brian Kernighan. awk, cuando ta escritu tou en minúscules, fai referencia al programa d'Unix o Plan 9 qu'interpreta programes escritos nel llinguaxe de programación AWK.

AWK ye exemplu d'un llinguaxe de programación qu'usa llargamente'l tipu de datos de llistes asociatives (esto ye, llistes indexadas por cadenes clave), y espresiones regulares. El poder, brevedá y llimitaciones de los programes d'AWK y los guiones de sei inspiraron a Larry Wall a escribir Perl. Por cuenta de la so trupa notación, toos estos llinguaxes son frecuentemente usaos pa escribir programes d'una llinia.

AWK foi una de les primeres ferramientes n'apaecer n'Unix (na versión 3) y ganó popularidá como una manera d'añader funcionalidad a les tuberíes d'Unix.
La implementación de dalguna versión del llinguaxe AWK ye estándar en cuasi tou sistema operativu tipu unix modernu. AWK ye mentáu nes Single UNIX Specification (especificaciones básiques de unix) como una de les utilidaes necesaries de too sistema operativu Unix. Pueden instalase implementaciones d'AWK en cuasi tolos demás sistemes operativos.

 Estructura de los programes AWK 
Xeneralmente falando, a AWK dánse-y dos pieces de datos: un ficheru d'órdenes y un ficheru primariu d'entrada. Un ficheru d'órdenes (que puede ser un ficheru real, o puede ser incluyíu na invocación d'AWK dende la llinia d'órdenes) contién una serie d'órdenes que-y dicen a AWK cómo procesar el ficheru d'entrada. El ficheru primariu d'entrada ye de normal testu formateado de dalguna manera; puede ser nun ficheru real, o puede ser lleíu por AWK de la entrada estándar (tecláu). Un programa AWK típicu consiste nuna serie de llinies, caúna de la forma

 /patrón/ { aición }

onde patrón ye una espresión regular y aición ye una orde. La mayoría de les implementaciones d'AWK usen espresiones regulares estendíes por defectu. AWK mira a lo llargo del ficheru d'entrada; cuando atopa una llinia que coincide col "patrón", executa la (s) orde (ye) indicaes en "aición".
Les formes alternatives inclúin:

 BEGIN { aición }
 Executa les órdenes aición al empiezu de la execución, antes de que los datos empiecen a ser procesaos.
 END { aición }
 Similar a la forma previa pero executa les órdenes aición dempués de que tolos datos seyan procesaos.
 /patrón/
 Imprime les llinies acordes al patrón.
 { aición }
 Executa aición por cada llinia na entrada.

Caúna d'estes formes pueden ser incluyíes delles vegaes nun archivu. El ficheru ye procesáu de manera progresiva, entós si hubiera dos declaraciones "BEGIN", los sos conteníos van ser executaos n'orde d'apaición. Les declaraciones "BEGIN" y "END" non precisen tar en forma ordenada.

AWK foi creáu como un reemplazu a los algoritmos escritos en C pa métodos d'analises de testu.

 Comandos d'AWK 
Los comandos d'AWK son les declaraciones sustituyíes por aición nos exemplos anteriores. Los comandos d'AWK pueden incluyir llamaes a funciones, asignación de variables, cálculos, o cualquier combinación d'estes. AWK contién soporte propiu pa munches funciones; munches otres son provistes poles distintes versiones d'AWK. Inclusive delles versiones soporten la inclusión de llibreríes dinámicamente enllazaes, que pueden aprovir entá más funciones.

Por claridá les llaves ({ }) van ser omitíes nos siguientes exemplos.

 El comandu print 
El comandu print ye usáu pa imprimir testu. La forma más simple d'esti comandu ye

print

Esto amuesa'l conteníu de la llinia anguaño procesada. En AWK les llinies son estremaes en campos, y estos pueden ser operaos individualmente:

 print $1
 Amuesa'l primer campu de la llinia actual
 print $1, $3
 Amuesa'l primera y tercer campu de la llinia actual, dixebraos por una cadena predefinida, separador de campos de salida o OFS (poles sos sigles n'inglés), que'l so valor predefinido ye un calter d'espaciu (' ').

Anque esta sintaxis ($#) puede suxerir que se traten de variables (el símbolu $ ye indicador de variables n'otros llinguaxes), faen referencia a los campos de la llinia actual. Un casu especial, $0, referir a la llinia entera. Ello ye que los comandos "print" y "print $0" resulten similares.

El comandu print puede tamién imprimir la resultancia de cálculos o funciones invocaes:

print 3+2
print foobar(3)
print foobar (variable)
print ensin(3-2)

La salida puede ser unviada a un archivu:

print "espresión" > "nome d'archivu"

 Variables 
Los nomes de variables pueden usar cualquier combinación de los calteres [A-Za-z0-9_], cola única esceición de les pallabres clave del llinguaxe. Los operadores + - * / son suma, resta, multiplicación y división respeutivamente. Pa la concatenación, basta con asitiar dos variables (o cadena constante) xunto a cualesquier otra, opcionalmente con un espaciu entemediu. Les cadenes son delimitadas por comines dobles. Nun ye necesariu rematar les órdenes con puntu y coma. Pueden añader comentarios del programa usando  # como primer calter nuna llinia.

 Funciones definíes pol usuariu 
De manera similar a C, la definición de funciones consiste na clave function, el nome de la función, los argumentos de la función y el cuerpu de la mesma, e.g.:

function:

 function sumar_trés (numbero, temporal) { # Los identificadores nun contienen la lletra ñ
 temporal = numbero + 3 # Tampoco pueden tener tildes
 return temporal
 }

Podemos invocar la función asina:

 print sumar_trés(36) # Imprime 39

Les funciones pueden tener variables definíes llocalmente. Los nomes d'estes son añadíos a la fin de la llista d'argumentos, anque los valores d'estes tienen de ser omitíos al llamar la función. Ye conveniente indentar les variables llocales na llista d'argumentos pa indicar ónde terminen los parámetros y ónde empiecen les variables locales.

 Exemplos 
 Hello World 
Esti ye un programa "Hola mundu" bien simple escritu en AWK:

 BEGIN { print "Hola mundu!"; exit }

 Imprimir llinies mayores a 80 calteres 
Imprime toles llinies con más de 80 calteres. Nótese que l'aición por defectu ye imprimir la llinia actual.

 length > 80 

 Contador de pallabres 
Cunta les pallabres na entrada y amuesa la cantidá de llinies, pallabres y calteres.

 { w += NF; c += length}
 END { print NR, w, c }

 Total de la primer columna 
Suma los valores de la primer columna de los datos ingresaos.

 { s += $1 }
 END { print s }

 Frecuencia de pallabres 
Esti programa usa llistes enllazaes pa determinar la cantidá de vegaes que cada pallabra apaez nel testu.

 BEGIN { FS="[^a-zA-Z]+"}

 { for (i=1; i<=NF; i++)
 words[tolower($i)]++
 }

 END { for (i in words)
 print i, words[i]
 }

 Programes autocontenidos 
Como cualesquier otru llinguaxe de programación, pueden escribise programes AWK autocontenidos usando la sintaxis de llinies de Shebang.

Por casu, un comandu UNIX llamáu holamundo.awk qu'imprima'l testu "Hola mundu!" podría ser escritu de la siguiente manera:

 #!/usr/bin/awk -f
 BEGIN { print "Hello, world!"; exit }

 AWK, versiones y implementaciones 
AWK foi escritu orixinalmente en 1977 con UNIX.

En 1985 los autores empiecen la espansión del llinguaxe, añadiendo funciones definíes pol usuariu. El llinguaxe ye descritu nel llibru The AWK Programming Language, publicáu en 1988. Pa evitar tracamundios cola versión anterior, a la que yera incompatible, esta versión conozse, dacuando, como "nuevu AWK" o "nawk".
Esta implementación foi publicada so una llicencia de software llibre en 1996, sigue siendo caltenida por Brian Wilson Kernighan.

GNU awk, o gawk, ye otra implementación llibre. Foi escrita primero que la implementación orixinal fuera publicada, y ye llargamente utilizada. Cuasi toles distribución linux inclúin una versión actualizada de gawk y gawk ye reconocíu como la implementación estándar nel mundu linux. La versión 30 de GAWK foi incluyida como awk na versión 5.0 de FreeBSD. Les versiones posteriores de BSD incluyeron nawk pa evitar l'usu de les GPL, unes llicencies de software llibre más restrictives que les BSD nel sentíu de qu'un programa publicáu so la llicencia GPL nun puede ser modificáu pa convertise en propietariu protexendo d'esta forma la llibertá del códigu fonte.

 xgawk
Páxina d'un proyeutu llibre basáu en gawk. Este estiende les funcionalidades de gawk pa dexa-y l'usu de llibreríes dinámiques.

 mawk ye una implementación AWK optimizada pa la velocidá, escrita por Mike Brennan y basada nun intérprete bytecode.

 Thompson AWK o TAWK ye un compilador AWK para DOS y Windows, primeramente vendíu por Thompson Automation Software.

 Jawk ye un proyeutu qu'implementa AWK en Java. Añadir estensiones pal llinguaxe p'aprovir accesu a carauterístiques de Java dientro de los programes AWK (e.g., Java threads, sockets, Collections, etc).

 Digresión 
 L'ave, emblema d'AWK (a.o na cubierta del llibru The AWK Programing Language ye l'Alca).

 Llibros 
  The book's webpage includes downloads of the current implementation of Awk and links to others.
  Arnold Robbins maintains the GNU Awk implementation of AWK for more than 10 years. The free GNU Awk manual was also published by O'Reilly in May 2001. Free download of this manual is possible through the following book references.



 Ver tamién 
 sei
 Llista de programes pa Unix

 Referencies 

 Enllaces esternos 
 awk maintained by Brian Kernighan.
 comp.lang.awk is a USENET newsgroup dedicated to AWK.
 gnulamp awk tutorial

 Implementaciones 
 GAWK (GNU awk) webpage
  GAWK for Windows  (de proyeutu GNU32win sourceforge)
 MAWK (Mike's AWK)
 DJGPP port of Gawk 3.11b as a downloadable 768KB zipfile
 xgawk download site
 Awka Open Source, AWK to C Conversion Tool
 TAWK Compiler (descatalogado)
 Jawk Open Source, an implementation of AWK in Java with extensions
 Inline::Awk módulu Perl en CPAN pa programar en Awk dientro de Perl (n'inglés)

Categoría:Llinguaxes interpretaos
Categoría:Programes del estándar Unix
Categoría:Acrónimos d'informática
Categoría:Compiladores y interpretadores llibres
Categoría:Utilidaes Unix LES SOS2008
Categoría:Software de 1977