Articulo de referencia

AWK

{{cite web|url=https://www6.software.ibm.com/developerworks/education/au-gawk/au-gawk-a4.pdf|title=Get started with GAWK: AWK language fundamentals|last=Stutz|first=Michael|date...

AWK ( / ɔː k / [ 4 ] ) es un lenguaje de scripting diseñado para el procesamiento de texto y que normalmente se utiliza como herramienta de extracción e informes de datos . Al igual que sed y grep , es un filtro , [ 4 ] y es una característica estándar de la mayoría de los sistemas operativos tipo Unix . El comando de shell que ejecuta el procesador AWK se llama .awk

El lenguaje AWK es un lenguaje de scripting orientado a datos que consta de un conjunto de acciones que se ejecutan sobre flujos de datos textuales, ya sea directamente en archivos o como parte de una canalización , con el fin de extraer o transformar texto, por ejemplo, para generar informes formateados. El lenguaje utiliza ampliamente el tipo de dato cadena , matrices asociativas (es decir, matrices indexadas por cadenas clave) y expresiones regulares . Si bien AWK tiene un dominio de aplicación previsto limitado y fue diseñado especialmente para admitir programas de una sola línea , el lenguaje es Turing-completo , e incluso los primeros usuarios de AWK en Bell Labs a menudo escribían programas AWK grandes y bien estructurados. [ 5 ]

AWK fue creado en Bell Labs en la década de 1970, [ 6 ] y su nombre deriva de los apellidos de sus autores: Alfred Aho (autor de egrep ), Peter Weinberger (quien trabajó en bases de datos relacionales pequeñas) y Brian Kernighan . El acrónimo se pronuncia igual que el nombre de la especie de ave auk , que se ilustra en la portada de The AWK Programming Language . [ 7 ]

Historia

Según Brian Kernighan, uno de los objetivos de AWK era tener una herramienta que pudiera manipular fácilmente tanto números como cadenas de caracteres. AWK también se inspiró en el lenguaje de programación de Marc Rochkind , que se utilizaba para buscar patrones en los datos de entrada, y se implementó utilizando yacc . [ 8 ]

Como una de las primeras herramientas que aparecieron en la versión 7 de Unix , AWK añadió funcionalidades de computación a la arquitectura de Unix , además del intérprete de comandos Bourne , el único lenguaje de scripting disponible en un entorno Unix estándar. Es una de las utilidades obligatorias de la Especificación Única de UNIX [ 9 ] y es requerida por la especificación Linux Standard Base [ 10 ] .

En 1983, AWK fue una de las varias herramientas UNIX disponibles para el sistema operativo UNOS de Charles River Data Systems bajo licencia de Bell Laboratories . [ 11 ]

AWK fue significativamente revisado y ampliado entre 1985 y 1988, dando como resultado la implementación de GNU AWK escrita por Paul Rubin, Jay Fenlason y Richard Stallman , publicada en 1988. [ 12 ] GNU AWK puede ser la versión más ampliamente desplegada [ 13 ] porque se incluye en los paquetes de Linux basados ​​en GNU. GNU AWK ha sido mantenido exclusivamente por Arnold Robbins desde 1994. [ 12 ] El código fuente de nawk (New AWK) de Brian Kernighan se publicó por primera vez en 1993 sin publicidad, y públicamente desde finales de la década de 1990; muchos sistemas BSD lo utilizan para evitar la licencia GPL. [ 12 ]

AWK fue precedido por sed (1974). Ambos fueron diseñados para el procesamiento de texto. Comparten el paradigma orientado a líneas y basado en datos, y son particularmente adecuados para escribir programas de una sola línea , debido al bucle principal implícito y las variables de línea actual. La potencia y la concisión de los primeros programas AWK —en particular, el potente manejo de expresiones regulares y la brevedad gracias a las variables implícitas, que facilitan los programas de una sola línea— junto con las limitaciones de AWK en ese momento, fueron importantes fuentes de inspiración para el lenguaje Perl (1987). En la década de 1990, Perl se hizo muy popular, compitiendo con AWK en el nicho de los lenguajes de procesamiento de texto de Unix.

Estructura de los programas AWK

AWK lee la entrada línea por línea. Se examina una línea para cada patrón del programa y, para cada patrón que coincide, se ejecuta la acción asociada.

Alfred V. Aho [ 14 ]

Un programa AWK es una serie de pares de acciones y patrones, escritos de la siguiente manera:

condición { acción } condición { acción } ...

donde la condición suele ser una expresión y la acción una serie de comandos. La entrada se divide en registros, separados por saltos de línea por defecto. El programa comprueba cada registro con cada una de las condiciones y ejecuta la acción correspondiente a cada expresión que sea verdadera. Se puede omitir la condición o la acción. Por defecto, la condición coincide con todos los registros. La acción predeterminada es imprimir el registro. Esta es la misma estructura de patrón-acción que sed.

Además de una expresión AWK simple, como foo == 1o /^foo/, la condición puede ser BEGINo ENDhaciendo que la acción se ejecute antes o después de que se hayan leído todos los registros, o patrón1, patrón2 que coincide con el rango de registros que comienza con un registro que coincide con patrón1 hasta e incluyendo el registro que coincide con patrón2 antes de intentar nuevamente coincidir con patrón1 en líneas subsiguientes.

Además de los operadores aritméticos y lógicos normales, las expresiones AWK incluyen el operador de tilde, ~, que compara una expresión regular con una cadena. Como azúcar sintáctico práctico , /regexp/ sin usar el operador de tilde compara con el registro actual; esta sintaxis deriva de sed , que a su vez la heredó del editor ed , donde /se usa para buscar. Esta sintaxis de usar barras diagonales como delimitadores para expresiones regulares fue adoptada posteriormente por Perl y ECMAScript , y ahora es común. El operador de tilde también fue adoptado por Perl.

Comandos

Los comandos AWK son las instrucciones que sustituyen a las acciones en los ejemplos anteriores. Pueden incluir llamadas a funciones, asignaciones de variables, cálculos o cualquier combinación de estos. AWK incluye soporte integrado para muchas funciones; las distintas versiones de AWK ofrecen muchas más. Además, algunas versiones admiten la inclusión de bibliotecas de enlace dinámico , que también proporcionan funciones adicionales.

El comando de impresión

El comando print se utiliza para imprimir texto. El texto de salida siempre termina con una cadena predefinida llamada separador de registros de salida (ORS), cuyo valor predeterminado es un salto de línea. La forma más sencilla de este comando es:

print
Esto muestra el contenido del registro actual. En AWK, los registros se dividen en campos , y estos se pueden mostrar por separado:
print $1
Muestra el primer campo del registro actual.
print $1, $3
Muestra el primer y el tercer campo del registro actual, separados por una cadena predefinida llamada separador de campo de salida (OFS), cuyo valor predeterminado es un solo espacio.

Aunque estos campos ( $X ) puedan parecerse a variables (el símbolo $ indica variables en los shells Unix habituales y en Perl ), en realidad se refieren a los campos del registro actual. Un caso especial, $0 , se refiere al registro completo. De hecho, los comandos " print" y " print $0" tienen la misma funcionalidad.

El comando print también puede mostrar los resultados de cálculos y/o llamadas a funciones:

/regex_pattern/ { # Acciones a realizar en caso de que el registro (línea) coincida con el patrón regex_pattern anterior print 3 + 2 print foobar ( 3 ) print foobar ( variable ) print sin ( 3 - 2 ) }

La salida puede enviarse a un archivo:

/regex_pattern/ { # Acciones a realizar en caso de que el registro (línea) coincida con el patrón regex_pattern anterior print "expresión" > "nombre de archivo" }

o a través de una tubería :

/regex_pattern/ { # Acciones a realizar en caso de que el registro (línea) coincida con el patrón regex_pattern anterior print "expresión" | "comando" }

Variables integradas

Las variables integradas de AWK incluyen las variables de campo: $1, $2, $3, etc. ($0 representa el registro completo). Estas variables almacenan el texto o los valores de los campos de texto individuales de un registro.

Otras variables incluyen:

  • NR: Número de registros. Mantiene un recuento actual del número de registros de entrada leídos hasta el momento de todos los archivos de datos. Comienza en cero, pero nunca se reinicia automáticamente a cero. [ 15 ]
  • FNR: Número de registros del archivo. Mantiene un recuento actual del número de registros de entrada leídos hasta el momento en el archivo actual. Esta variable se restablece automáticamente a cero cada vez que se inicia un nuevo archivo. [ 15 ]
  • NF: Número de campos. Contiene el número de campos en el registro de entrada actual. El último campo del registro de entrada se puede designar con $NF, el penúltimo con $(NF-1), el antepenúltimo con $(NF-2), etc.
  • FILENAME: Contiene el nombre del archivo de entrada actual.
  • FS: Separador de campos. Contiene el separador de campos que se utiliza para dividir los campos en el registro de entrada. El valor predeterminado, "espacio en blanco", permite cualquier secuencia de espacios y tabulaciones. Se puede reasignar el separador de campos con otro carácter o secuencia de caracteres.
  • RS: Separador de registros. Almacena el carácter "separador de registros" actual. Dado que, por defecto, una línea de entrada es el registro de entrada, el carácter separador de registros predeterminado es un "salto de línea".
  • OFS: Separador de campos de salida. Almacena el "separador de campos de salida", que separa los campos cuando awk los imprime. El valor predeterminado es un espacio.
  • ORS: Separador de registros de salida. Almacena el "separador de registros de salida", que separa los registros de salida cuando awk los imprime. El valor predeterminado es un carácter de "salto de línea".
  • OFMT: Formato de salida. Almacena el formato para la salida numérica. El formato predeterminado es "%.6g".

Variables y sintaxis

Con excepción de las palabras clave del lenguaje, los nombres de las variables pueden usar cualquiera de estos caracteres siempre que no comience con un dígito numérico  :

[ a - zA - Z_0 - 9 ]

Los operadores +-*/^%representan suma, resta, multiplicación, división, potenciación y resto, respectivamente. Para la división y el resto, se aplican los mismos operadores tanto a divisiones de enteros como de punto flotante. Para obtener un cociente entero a partir de operandos enteros, cualquier resto debe restarse previamente del dividendo, como se muestra a continuación  :

awkCOMIENZO { OFMT = "%.14g"imprimir 331 % - 79imprimir - 3,31e-11 % 7,9e-23impresión 331 / 79imprimir ( 331 - 331 % 79 ) / 79} '15- 1.1999020635259e-234.18987341772154

Este int( dividend / divisor )enfoque puede generar casos límite que redondean incorrectamente. Para la concatenación de cadenas , simplemente coloque dos variables (o constantes de cadena) una al lado de la otra. Es opcional usar un espacio entre ellas si se trata de constantes de cadena, pero dos nombres de variables colocados uno al lado del otro requieren un espacio entre ellos. A diferencia de los shells de Unix u otros lenguajes como Perl, el nombre de variable de un solo guion bajo sin sigilo ( _) no está reservado ni es especial, y el usuario puede utilizarlo libremente. Dado que su valor predeterminado es el valor NULL especial de AWK que es simultáneamente cero numérico y la cadena vacía, incluso podría imitar el de Perl $_como un alias para $0 :

jot 30 | perl - nle ' print $_ << $_ ' | awk ' { print 2 ^ $_ * $_ } '

Las comillas dobles ( "..."), y solo las comillas dobles, delimitan las constantes de cadena. Las sentencias y/o expresiones no necesitan terminar con punto y coma. De hecho, el único lugar donde el punto y coma ;es absolutamente inevitable es la variante de 3 argumentos del for ()bucle que se asemeja mucho a su contraparte en C/C++. Todos los argumentos que no son matrices a las funciones se pasan "por valor", lo que permite que la función los mute libremente y garantiza que no haya efectos secundarios para quien llama a la función.

A diferencia de Python, todas las asignaciones aumentadas en awkeste lenguaje +=-=*=/=^=%=son expresiones. Esto permite un encadenamiento efectivo de longitud ilimitada. Una de sus mayores ventajas se demuestra con el algoritmo para calcular los números de Fibonacci, cuya complejidad es de , O(n) debido a que se sigue sumando a sí mismo: a += b += a += b += a += b += ... Para los primeros 77 números de Fibonacci, aproximadamente, este enfoque es muy efectivo, ya que evita tener que examinar bits, intercambiar variables o incurrir en la sobrecarga de la recursión.

Finalmente, se pueden agregar comentarios a los programas utilizando #como primer carácter en una línea, o después de un comando o secuencia de comandos.

Funciones definidas por el usuario

En un formato similar al de C , las definiciones de funciones constan de la palabra clave function, el nombre de la función, los nombres de los argumentos y el cuerpo de la función. Aquí hay un ejemplo de una función.

función agregar_tres ( número ) { devolver número + 3 }

Esta instrucción se puede invocar de la siguiente manera:

( patrón ) { imprimir add_three ( 36 ) # Salida '''39''' }

Las funciones pueden tener variables de ámbito local. Los nombres de estas variables se añaden al final de la lista de argumentos, aunque sus valores deben omitirse al llamar a la función. Por convención, se añade un espacio en blanco en la lista de argumentos antes de las variables locales para indicar dónde terminan los parámetros y dónde comienzan las variables locales.

Ejemplos

¡Hola Mundo!

Aquí está el programa habitual "¡Hola, mundo!" escrito en AWK:

INICIO { imprimir "¡Hola, mundo!" salir }

Imprime todas las líneas de más de 80 caracteres. La acción predeterminada es imprimir la línea actual.

longitud ( $ 0 ) > 80

Contar palabras

Cuenta las palabras en la entrada e imprime el número de líneas, palabras y caracteres (como wc ):

{ palabras += NF caracteres += longitud + 1 # se suma uno para tener en cuenta el carácter de nueva línea al final de cada registro (línea) } FIN { imprimir NR , palabras , caracteres }

Como no hay un patrón para la primera línea del programa, cada línea de entrada coincide por defecto, por lo que las acciones de incremento se ejecutan para cada línea. words += NFes una abreviatura de words = words + NF.

Última palabra de Sum

{ s += $ NF } FIN { imprimir s + 0 }

sse incrementa por el valor numérico de $NF, que es la última palabra de la línea según lo define el separador de campos de AWK (por defecto, espacio en blanco). NFes el número de campos en la línea actual, por ejemplo, 4. Dado que $4es el valor del cuarto campo, $NFes el valor del último campo de la línea, independientemente de cuántos campos tenga esta línea, o si tiene más o menos campos que las líneas circundantes. $es en realidad un operador unario con la mayor precedencia de operador . (Si la línea no tiene campos, entonces NFes 0, $0es la línea completa, que en este caso está vacía salvo por posibles espacios en blanco, y por lo tanto tiene el valor numérico 0).

Al final de la entrada, el ENDpatrón coincide, por lo que sse imprime. Sin embargo, dado que puede que no haya habido ninguna línea de entrada, en cuyo caso nunca se ha asignado ningún valor a s, sserá una cadena vacía por defecto. Agregar cero a una variable es un modismo de AWK para convertirla de una cadena a un valor numérico. Esto resulta de los operadores aritméticos de AWK, como la suma, que convierten implícitamente sus operandos a números antes del cálculo según sea necesario. (De manera similar, concatenar una variable con una cadena vacía la convierte de un número a una cadena, por ejemplo, s "". Tenga en cuenta que no hay un operador para concatenar cadenas, simplemente se colocan adyacentes). En una entrada vacía, la conversión en { print s + 0 }hace que el programa imprima 0, mientras que con solo la acción { print s }, se imprimiría una línea vacía.

Coincidencia con un rango de líneas de entrada

NR % 4 == 1 , NR % 4 == 3 { printf "%6d %s\n" , NR , $ 0 }

La instrucción de acción imprime cada línea numerada. La función printf emula la función printf estándar de C y funciona de manera similar al comando print descrito anteriormente. Sin embargo, el patrón de coincidencia funciona de la siguiente manera: NR es el número de registros, normalmente líneas de entrada, que AWK ha leído hasta el momento, es decir, el número de línea actual, comenzando en 1 para la primera línea de entrada. % es el operador módulo . NR  % 4 == 1 es verdadero para la 1.ª, 5.ª, 9.ª, etc., línea de entrada. Del mismo modo, NR  % 4 == 3 es verdadero para la 3.ª, 7.ª, 11.ª, etc., línea de entrada. El patrón de rango es falso hasta que la primera parte coincide, en la línea 1, y luego permanece verdadero hasta que la segunda parte coincide, en la línea 3 inclusive. Luego permanece falso hasta que la primera parte coincide de nuevo en la línea 5.

Así, el programa imprime las líneas 1, 2 y 3, omite la línea 4, y luego las líneas 5, 6 y 7, y así sucesivamente. Para cada línea, imprime el número de línea (en un campo de 6 caracteres de ancho) y luego el contenido de la línea. Por ejemplo, cuando se ejecuta con esta entrada:

Roma Florencia Milán Nápoles Turín Venecia

El programa anterior imprime:

 1 Roma 2 Florencia 3 Milán 5 Turín 6 Venecia

Imprimir la parte inicial o final de un archivo.

Como caso especial, cuando la primera parte de un patrón de rango es constantemente verdadera, por ejemplo 1 , el rango comenzará al principio de la entrada. De manera similar, si la segunda parte es constantemente falsa, por ejemplo 0 , el rango continuará hasta el final de la entrada. Por ejemplo,

/^--cortar aquí--$/ , 0

Imprime líneas de entrada desde la primera línea que coincide con la expresión regular ^--cortar aquí--$ , es decir, una línea que contiene solo la frase "--cortar aquí--", hasta el final.

Calcular frecuencias de palabras

Frecuencia de palabras mediante matrices asociativas :

INICIO { FS = "[^a-zA-Z]+" } { para ( i = 1 ; i <= NF ; i ++ ) palabras [ tolower ( $ i )] ++ } FIN { para ( i en palabras ) imprimir i , palabras [ i ] }

El bloque BEGIN establece el separador de campos a cualquier secuencia de caracteres no alfabéticos. Los separadores pueden ser expresiones regulares. Después, llegamos a una acción simple, que realiza la acción en cada línea de entrada. En este caso, para cada campo en la línea, sumamos uno al número de veces que aparece esa palabra, primero convertida a minúsculas. Finalmente, en el bloque END, imprimimos las palabras con sus frecuencias. La línea

para (i en palabras)

crea un bucle que recorre el array `words` , asignando `i` a cada subíndice del array. Esto difiere de la mayoría de los lenguajes, donde un bucle similar recorre cada valor del array. El bucle imprime cada palabra seguida de su frecuencia de aparición. Esta funcionalidad tolowerse añadió a la versión "One True" de `awk` (véase más abajo) después de la publicación del libro.

Coincidencia de patrón desde la línea de comandos

Este programa se puede representar de varias maneras. La primera utiliza el intérprete de comandos Bourne para crear un script que lo haga todo. Es el método más corto:

#!/bin/shpatrón = " $1 " shift awk '/' " $pattern " '/ { print FILENAME ":" $0 }' " $@ "

El $patternen el comando awk no está protegido por comillas simples, por lo que el shell expande la variable, pero necesita ponerse entre comillas dobles para manejar correctamente los patrones que contienen espacios. Un patrón por sí solo de la forma habitual comprueba si toda la línea ( $0) coincide. FILENAMEcontiene el nombre del archivo actual. awk no tiene un operador de concatenación explícito; dos cadenas adyacentes las concatenan. $0se expande a la línea de entrada original sin cambios.

Hay formas alternativas de escribir esto. Este script de shell accede al entorno directamente desde dentro de awk:

#!/bin/shexport pattern = " $1 " shift awk '$0 ~ ENVIRON["pattern"] { print FILENAME ":" $0 }' " $@ "

Este es un script de shell que utiliza ENVIRONun array introducido en una versión más reciente de awk (One True) después de la publicación del libro. El subíndice de ENVIRONes el nombre de una variable de entorno; su resultado es el valor de la variable. Esto es similar a la función getenv en varias bibliotecas estándar y POSIX . El script de shell crea una variable de entorno patternque contiene el primer argumento, luego elimina ese argumento y hace que awk busque el patrón en cada archivo.

~Comprueba si su operando izquierdo coincide con su operando derecho; !~es su inverso. Una expresión regular es simplemente una cadena de caracteres y puede almacenarse en variables.

La siguiente forma utiliza la asignación de variables de línea de comandos, en la que un argumento de awk puede verse como una asignación a una variable:

#!/bin/shpatrón = " $1 " shift awk '$0 ~ patrón { print FILENAME ":" $0 }' patrón = " $pattern " " $@ "

O bien, puede utilizar la opción de línea de comandos -v var=valor (por ejemplo , awk -v patrón="$patrón" ... ).

Finalmente, esto está escrito en awk puro, sin ayuda de un shell ni necesidad de saber demasiado sobre la implementación del script awk (como ocurre con la asignación de variables en la línea de comandos), pero es un poco extenso:

BEGIN { patrón = ARGV [ 1 ] para ( i = 1 ; i < ARGC ; i ++ ) # eliminar el primer argumento ARGV [ i ] = ARGV [ i + 1 ] ARGC -- si ( ARGC == 1 ) { # el patrón era lo único, así que forzar la lectura desde la entrada estándar (usada por el libro) ARGC = 2 ARGV [ 1 ] = "-" } } $ 0 ~ patrón { imprimir NOMBRE DE ARCHIVO ":" $ 0 }

Es BEGINnecesario no solo extraer el primer argumento, sino también evitar que se interprete como un nombre de archivo después de que BEGINtermine el bloque. ARGC, el número de argumentos, siempre se garantiza que sea ≥1, al igual que ARGV[0]es el nombre del comando que ejecutó el script, generalmente la cadena "awk". ARGV[ARGC]es la cadena vacía, "". #inicia un comentario que se expande hasta el final de la línea.

Observe el ifbloque. awk solo comprueba si debe leer desde la entrada estándar antes de ejecutar el comando. Esto significa que

awk 'prog'

Solo funciona porque el hecho de que no haya nombres de archivo se comprueba antes progde ejecutarse. Si lo estableces explícitamente ARGCen 1 para que no haya argumentos, awk simplemente se detendrá porque considera que no hay más archivos de entrada. Por lo tanto, debes indicar explícitamente que lea desde la entrada estándar con el nombre de archivo especial -.

Scripts AWK autónomos

En los sistemas operativos tipo Unix, se pueden construir scripts AWK autónomos utilizando la sintaxis shebang .

Por ejemplo, se puede crear un script que envíe el contenido de un archivo determinado a la salida estándar creando un archivo print.awkcon el siguiente contenido:

#!/usr/bin/awk -f { print $ 0 }

Se puede invocar con:./print.awk <filename>

Esto -fle indica a awk que el argumento que sigue es el archivo desde el que leerá el programa AWK, que es el mismo indicador que se usa en sed. Dado que a menudo se usan para comandos de una sola línea, ambos programas ejecutan por defecto el programa proporcionado como argumento de línea de comandos, en lugar de un archivo aparte.

Versiones e implementaciones

AWK fue escrito originalmente en 1977 y distribuido con la versión 7 de Unix .

En 1985, sus autores comenzaron a expandir el lenguaje, principalmente mediante la adición de funciones definidas por el usuario. El lenguaje se describe en el libro The AWK Programming Language , publicado en 1988, y su implementación se incluyó en las versiones de UNIX System V. Para evitar confusiones con la versión anterior incompatible, esta versión a veces se denominaba "new awk" o nawk . Esta implementación se publicó bajo una licencia de software libre en 1996 y Brian Kernighan aún la mantiene (véanse los enlaces externos a continuación).

Las versiones antiguas de Unix, como UNIX/32V , incluían awkcc, que convertía AWK a C. Kernighan escribió un programa para convertir awk a C++ ; se desconoce su estado. [ 16 ]

  • BWK awk , también conocido como nawk , se refiere a la versión de Brian Kernighan . Se le ha denominado "One True AWK" debido al uso del término en asociación con el libro que describió originalmente el lenguaje y al hecho de que Kernighan fue uno de los autores originales de AWK. [ 7 ] FreeBSD se refiere a esta versión como one-true-awk . [ 17 ] Esta versión también tiene características que no están en el libro, como tolowery ENVIRONque se explican más arriba; consulte el archivo FIXES en el archivo fuente para obtener más detalles. Esta versión es utilizada por, por ejemplo, Android , FreeBSD , NetBSD , OpenBSD , macOS e illumos . Brian Kernighan y Arnold Robbins son los principales contribuyentes a un repositorio fuente para nawk : github.com/onetrueawk/awk .
  • gawk ( GNU awk) es otra implementación de software libre y la única que realiza avances significativos en la implementación de internacionalización, localización y redes TCP/IP. Fue escrita antes de que la implementación original estuviera disponible gratuitamente. Incluye su propio depurador y su perfilador permite al usuario realizar mejoras de rendimiento medidas en un script. También permite al usuario extender la funcionalidad con bibliotecas compartidas. Algunas distribuciones de Linux incluyen gawk como su implementación AWK predeterminada. A partir de la versión 5.2 (septiembre de 2022), gawk incluye una función de memoria persistente que puede recordar variables y funciones definidas por el script de una invocación del mismo a la siguiente y pasar datos entre scripts no relacionados, como se describe en el Manual del usuario de gawk de memoria persistente : www.gnu.org/software/gawk/manual/pm-gawk/ .
    • gawk-csv . La extensión CSV de gawk proporciona funcionalidades para la entrada y salida de datos en formato CSV. [ 18 ]
  • mawk es una implementación muy rápida de AWK creada por Mike Brennan, basada en un intérprete de código de bytes .
  • libmawk es una bifurcación de mawk que permite a las aplicaciones integrar múltiples instancias paralelas de intérpretes awk.
  • awka (cuya interfaz está escrita sobre el programa mawk ) es otro traductor de scripts AWK a código C. Al compilarse, incluyendo estáticamente la biblioteca libawka.a del autor, los ejecutables resultantes se ejecutan considerablemente más rápido y, según las pruebas del autor, ofrecen un rendimiento muy similar al de otras versiones de AWK, Perl o Tcl . Los scripts pequeños se convierten en programas de entre 160 y 170 kB.
  • tawk (Thompson AWK) es un compilador AWK para Solaris , MS-DOS , OS/2 y Windows , vendido por Thompson Automation Software (empresa desaparecida). [ 19 ]
  • Jawk es un proyecto para implementar AWK en Java , alojado en SourceForge. [ 20 ] Se agregan extensiones al lenguaje para brindar acceso a características de Java dentro de los scripts de AWK (es decir, subprocesos de Java, sockets, colecciones, etc.).
  • xgawk es una bifurcación de gawk [ 21 ] que extiende gawk con bibliotecas de carga dinámica. La extensión XMLgawk se integró en la versión oficial 4.1.0 de GNU Awk.
  • Hawk es un intérprete AWK integrable escrito en C y alojado en Github . Comenzó como QSEAWK , un intérprete AWK integrado incluido en la biblioteca QSE. [ 22 ]
  • libfawk es un intérprete muy pequeño, exclusivamente funcional, reentrante e integrable, escrito en C.
  • BusyBox incluye una implementación de AWK escrita por Dmitry Zakharov. Se trata de una implementación muy pequeña, adecuada para sistemas embebidos.
  • CLAWK de Michael Parker proporciona una implementación de AWK en Common Lisp , basada en la biblioteca de expresiones regulares del mismo autor. [ 23 ]
  • goawk es una implementación de AWK en Go con algunas extensiones de conveniencia creadas por Ben Hoyt y alojada en Github .

El manual de gawk tiene una lista de más implementaciones de AWK. [ 24 ]

Libros

  • Aho, Alfred V.; Kernighan , Brian W .; Weinberger, Peter J. (1988-01-01). El lenguaje de programación AWK . Nueva York, NY: Addison-Wesley . ISBN 0-201-07981-X. Consultado el 22 de enero de 2017 .
  • Aho, Alfred V.; Kernighan , Brian W .; Weinberger, Peter J. (6 de septiembre de 2023). El lenguaje de programación AWK, segunda edición . Hoboken, Nueva Jersey: Addison-Wesley Professional . ISBN 978-0-13-826972-2Archivado del original el 27/10/2023 . Consultado el 03/11/2023 .
  • Dougherty, Dale ; Robbins, Arnold (1 de marzo de 1997). sed y awk (2ª  ed.). Sebastopol, CA: O'Reilly Media. ISBN 1-56592-225-5. Consultado el 16 de abril de 2009 .
  • Robbins, Arnold (15 de mayo de 2001). Programación eficaz con awk (3.ª  ed.). Sebastopol, CA: O'Reilly Media . ISBN 0-596-00070-7. Consultado el 16 de abril de 2009 .
  • Robbins, Arnold (2000). Programación eficaz con Awk: Guía del usuario para Gnu Awk (  ed. 1.0.3). Bloomington, IN: iUniverse . ISBN 0-595-10034-1Archivado del original el 12 de abril de 2009. Consultado el 16 de abril de 2009 .

Véase también

Referencias

  1. Stutz, Michael (19 de septiembre de 2006). "Introducción a GAWK: Fundamentos del lenguaje AWK" (PDF) . developerWorks . IBM . Archivado (PDF) del original el 27 de abril de 2015. Consultado el 29 de enero de 2015. [ AWK] se suele denominar lenguaje orientado a datos: las instrucciones del programa describen los datos de entrada que se van a comparar y procesar, en lugar de una secuencia de pasos del programa.
  2. Andreas J. Pilavakis (1989). Taller UNIX . Macmillan International Higher Education. pág. 196. 
  3. Arnold Robbins (2015). Programación eficaz con Awk: procesamiento universal de texto y coincidencia de patrones (4.ª ed.). O'Reilly Media. pág. 560.  
  4. 1 2 James W. Livingston (2 de mayo de 1988). "El gran programa awk no es ninguna tontería". Digital Review . pág. 91. 
  5. Raymond, Eric S. "Aplicación de minilenguajes" . El arte de la programación Unix . Estudio de caso: awk. Archivado del original el 30 de julio de 2008. Recuperado el 11 de mayo de 2010. El lenguaje de acciones awk es Turing-completo y puede leer y escribir archivos.
  6. Aho, Alfred V .; Kernighan, Brian W .; Weinberger, Peter J. (1 de septiembre de 1978). Awk: un lenguaje de escaneo y procesamiento de patrones (segunda edición) (informe técnico). Manual de Unix, séptima edición, volumen 2. Bell Telephone Laboratories, Inc. Recuperado el 1 de febrero de 2020 .
  7. 1 2 Aho, Alfred V.; Kernighan, Brian W.; Weinberger, Peter J. (1988). El lenguaje de programación AWK . Addison-Wesley Publishing Company. ISBN 9780201079814Consultado el 16 de mayo de 2015 .
  8. "Especial UNIX: Profesores Kernighan y Brailsford" . Computerphile . 30 de septiembre de 2015. Archivado del original el 22 de noviembre de 2021.
  9. "Especificación única de UNIX, versión 3, tabla de interfaz de utilidades" . Archivado del original el 5 de enero de 2018. Consultado el 18 de diciembre de 2005 .
  10. «Capítulo 15. Comandos y utilidades». Especificación básica estándar de Linux 4.0 (Informe técnico). Fundación Linux. 2008. Archivado del original el 16 de octubre de 2019. Consultado el 1 de febrero de 2020 .
  11. La guía del iniciado para el universo (PDF) . Charles River Data Systems, Inc. 1983. pág. 13. Archivado (PDF) del original el 25/02/2024 . Consultado el 10/02/2024 . 
  12. 1 2 3 Robbins, Arnold (marzo de 2014). "El proyecto GNU y yo: 27 años con GNU AWK" (PDF) . skeeve.com . Archivado (PDF) del original el 6 de octubre de 2014. Recuperado el 4 de octubre de 2014 .
  13. ^ Dougherty, Dale; Robbins, Arnold (1997). sed y awk (2ª ed.). Sebastopol, CA: O'Reilly. pag. 221.ISBN   1-565-92225-5.
  14. Hamilton, Naomi (30 de mayo de 2008). "El AZ de los lenguajes de programación: AWK" . Computerworld . Archivado del original el 1 de febrero de 2020. Consultado el 12 de diciembre de 2008 .
  15. 1 2 "Registros" . GAWK: Programación eficaz con AWK: Guía del usuario para GNU Awk ( ed. 5.3). Septiembre de 2024. Archivado del original el 12 de abril de 2009. Consultado el 24 de enero de 2025 . 
  16. Kernighan, Brian W. (24-25 de abril de 1991). Un traductor de AWK a C++ (PDF) . Conferencia Usenix C++. Washington, DC. págs. 217-228 . Archivado (PDF) del original el 22 de junio de 2020. Recuperado el 1 de febrero de 2020 . 
  17. "Registro de trabajo de FreeBSD para la importación de BWK awk al núcleo de FreeBSD" . 16 de mayo de 2005. Archivado del original el 8 de septiembre de 2013. Recuperado el 20 de septiembre de 2006 .
  18. "Procesamiento de CSV con gawk (usando la extensión gawk-csv)" . gawkextlib . 2018. Archivado del original el 25 de marzo de 2020.
  19. James K. Lawless (1 de mayo de 1997). "Examinando el compilador TAWK" . Dr. Dobb's Journal . Archivado del original el 21 de febrero de 2020. Recuperado el 21 de febrero de 2020 .
  20. " Jawk en SourceForge" . Archivado del original el 27 de mayo de 2007. Consultado el 23 de agosto de 2006 .
  21. " Página principal de xgawk " . Archivado del original el 18 de abril de 2013. Consultado el 7 de mayo de 2013 .
  22. "QSEAWK en GitHub" . GitHub . Archivado del original el 11 de junio de 2018. Consultado el 6 de septiembre de 2017 .
  23. "CLAWK en GitHub" . GitHub . Archivado del original el 25 de agosto de 2021. Consultado el 1 de junio de 2021 .
  24. "B.5 Otras implementaciones de awk disponibles gratuitamente" . GAWK: Programación eficaz con AWK: Guía del usuario para GNU Awk ( ed. 5.3). Septiembre de 2024. Archivado del original el 12 de febrero de 2025. Consultado el 24 de enero de 2025 . 

Lecturas adicionales

  • Andy Oram (19 de mayo de 2021). "Awk: El poder y la promesa de un lenguaje de 40 años" . Fosslife . Consultado el 9 de junio de 2021 .
  • Hamilton, Naomi (30 de mayo de 2008). "El AZ de los lenguajes de programación: AWK" . Computerworld . Archivado del original el 1 de febrero de 2020. Recuperado el 12 de diciembre de 2008 . – Entrevista con Alfred V. Aho en AWK
  • Robbins, Daniel (1 de diciembre de 2000). "Awk con ejemplos, Parte 1: Una introducción al gran lenguaje con el nombre extraño" . Common threads . IBM DeveloperWorks . Recuperado el 16 de abril de 2009 .
  • Robbins, Daniel (1 de enero de 2001). "Awk por ejemplo, parte 2: registros, bucles y matrices" . Hilos comunes . IBM DeveloperWorks . Recuperado el 16 de abril de 2009 .
  • Robbins, Daniel (1 de abril de 2001). "Awk con ejemplos, Parte 3: Funciones de cadena y... ¿chequeras?" . Temas comunes . IBM DeveloperWorks. Archivado del original el 19 de mayo de 2009. Recuperado el 16 de abril de 2009 .
  • AWK  – Conviértete en un experto en 60 minutos
  • awkLenguaje de escaneo y procesamiento de patrones Referencia de shell y utilidades, Especificación única de UNIX , Versión 5 de The Open Group   
  • gawk(1) Manual de usuario de Linux – Comandos de usuario 
  • El asombroso y torpe ensamblador de Henry Spencer .
  • "AWK (anteriormente) en Curlie" . Curlie . Archivado del original el 18 de marzo de 2022.
  • awklang.org El sitio web dedicado a todo lo relacionado con el lenguaje awk.
  • Portal de la comunidad Awk en Wayback Machine (archivado el 3 de abril de 2016)
Obtenido de " https://en.wikipedia.org/w/index.php?title=AWK&oldid=1359413307#Versions_and_implementations "