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 '''A'''ho, Peter '''W'''einberger, y Brian '''K'''ernighan. 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


```awk
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:


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


La salida puede ser unviada a un archivu:


```awk
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.:


```awk
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:


```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.


```awk
length > 80
```


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


```awk
{ 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.


```awk
{ 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.


```awk
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:


```awk
#!/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.
* [news:comp.lang.awk 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)