AWK

De Wikipedia
Saltar a navegación Saltar a la gueta

Plantía:Ficha de llinguaxe de programación

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ñedir 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[editar | editar la fonte]

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 per 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[editar | editar la fonte]

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[editar | editar la fonte]

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 suxurir 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[editar | editar la fonte]

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. El operadores + - * / son suma, resta, multiplicación y división respeutivamente. Pa la concatenación, basta con asitiar dos variables (o cadena constante) al pie de 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ñedir comentarios del programa usando # como primer calter nuna llinia.

Funciones definíes pol usuariu[editar | editar la fonte]

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, y.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ñedí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[editar | editar la fonte]

Hello World[editar | editar la fonte]

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

 BEGIN { print "Hola mundu!"; exit }

Imprimir llinies mayores a 80 calteres[editar | editar la fonte]

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[editar | editar la fonte]

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[editar | editar la fonte]

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

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

Frecuencia de pallabres[editar | editar la fonte]

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[editar | editar la fonte]

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[editar | editar la fonte]

AWK foi escritu orixinalmente en 1977 con UNIX.

En 1985 el autores empiecen la espansión del llinguaxe, añediendo 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.

Páxina d'un proyectu 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.
  • Jawk ye un proyectu qu'implementa AWK en Java. Añedir estensiones pal llinguaxe p'aprovir accesu a carauterístiques de Java dientro de los programes AWK (y.g., Java threads, sockets, Collections, etc).

Digresión[editar | editar la fonte]

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

Llibros[editar | editar la fonte]

Ver tamién[editar | editar la fonte]

Enllaces esternos[editar | editar la fonte]

Implementaciones[editar | editar la fonte]




AWK