awk

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
awk [2023/04/12 01:38] peronawk [2024/03/10 18:06] (actual) peron
Línea 2: Línea 2:
  
 **awk** es un lenguaje de análisis y procesado orientado a patrones de texto. Está diseñado para hacer sencilla las tareas de recopilación común de información y manipulación de texto. **awk** es un lenguaje de análisis y procesado orientado a patrones de texto. Está diseñado para hacer sencilla las tareas de recopilación común de información y manipulación de texto.
- 
-La operación básica de awk es analizar un conjunto de líneas de **entrada** en orden buscando por //coincidencias// que se han especificado. Para cada patrón, puede especificarse una acción; esta acción será llevada a cabo en cada línea que muestre coincidencias, y se le dará **salida** (mostrándolo en la terminal o redirigiéndola). 
  
 En la práctica, el uso de awk suele caer en dos amplias categorías. Una es la que podría considerarse **generación de informes**: esto implica el procesado de una entrada para extraer conteos, sumas, subtotales, etcétera. Esto también incluye la escritura de programas de validación de datos triviales, como la verificación de campos que contengan contiene únicamente información numérica o analizar si ciertos delimitadores están adecuadamente balanceados. En la práctica, el uso de awk suele caer en dos amplias categorías. Una es la que podría considerarse **generación de informes**: esto implica el procesado de una entrada para extraer conteos, sumas, subtotales, etcétera. Esto también incluye la escritura de programas de validación de datos triviales, como la verificación de campos que contengan contiene únicamente información numérica o analizar si ciertos delimitadores están adecuadamente balanceados.
Línea 9: Línea 7:
 Una segunda categoría es su uso como **transformador de datos**, convirtiendo datos de la forma producida por un programa en la esperada por otro distinto. Los ejemplos más simples consisten en simplemente seleccionar campos, y tal vez reorganizarlos. Una segunda categoría es su uso como **transformador de datos**, convirtiendo datos de la forma producida por un programa en la esperada por otro distinto. Los ejemplos más simples consisten en simplemente seleccionar campos, y tal vez reorganizarlos.
  
->awk resulta invaluable para el el procesado textual y numérico combinado.+>awk resulta invaluable para el el procesado textual y numérico combinado. Fue creado por Aho, Weinberger y Kerningham en los [[Laboratorios Bell]], de allí su nombre.
  
 +====Uso básico====
 +
 +La operación básica de awk es analizar un conjunto de líneas de **entrada** en orden buscando por //coincidencias// que se han especificado. Para cada patrón, puede especificarse una acción; esta acción será llevada a cabo en cada línea que muestre coincidencias, y se le dará **salida** (mostrándolo en la terminal o redirigiéndola).
 +
 +El comando 
 +<code awk>awk programa [ficheros]</code>
 +ejecuta los comandos de awk de la cadena ''programa'' sobre el conjunto de ''ficheros'' especificados, o bien utilizará la entrada estándar si no se hubiesen espeficado fichero alguno para analizar. La declaración también puede volcarse a un ''fichero_salida'' con el prefijo ''-f'':
 +
 +<code awk>awk -f fichero_salida [ficheros]</code>
  
 ====Estructura de Programa de awk==== ====Estructura de Programa de awk====
Línea 20: Línea 27:
 A su turno, cada línea de //entrada// resulta analizada por awk contra cada //[[#patrones|patrón]]//. En cada uno de los patrones en los que encuentre coincidencia, awk ejecutará la //[[#accion|acción]]// solicitada. Una vez que awk ha finalizado de evaluar todos los patrones solicitados en la línea, cargará la siguiente línea, y comenzará nuevamente el análisis de la misma. A su turno, cada línea de //entrada// resulta analizada por awk contra cada //[[#patrones|patrón]]//. En cada uno de los patrones en los que encuentre coincidencia, awk ejecutará la //[[#accion|acción]]// solicitada. Una vez que awk ha finalizado de evaluar todos los patrones solicitados en la línea, cargará la siguiente línea, y comenzará nuevamente el análisis de la misma.
  
-En cada declaración del programa pueden omitirse tanto el patrón como acciónpero no pueden omitirse ambas. Si un patrón carece de acción, la línea coincidente simplemente se presenta como //salida// (por lo tanto una linea con muchos patrones coincidentes puede resultar impresa varias veces). Si una acción carece de patrones, entonces dicha acción se se realizará para cada línea de entrada+Como en las declaraciones del programa awk tanto los patrones como acciones son opcionalescomo forma de distinguir unos de otras se encierra la acción entre llaves ''{}'' para distinguirla.
  
-Naturalmente, las líneas cuyos patrones no tienen coincidenciaresultan ignoradas ("filtradas").+En cada declaración del programa pueden omitirse tanto el patrón como acciónpero no pueden omitirse ambas: 
 +  * Si la acción carece de patrón, la acción se ejecutará para todas las líneas de entrada. 
 +  * Si un patrón carece de acciónla línea coincidente se devolverá como //salida// (una linea con muchos patrones coincidentes será impresa varias veces).
  
-Como en las declaraciones de awk tanto los patrones como acciones resultan opcionales, como forma de distinguir unos de otras, son las acciones las que se encierran entre llaves ''{}''.+Naturalmente, las líneas cuyos patrones no resultan en coincidencia, son ignoradas ("filtradas").
  
 +Pueden disponerse comentarios en los programas de awk (los cuales también resultan filtrados). Estos comienzan con el carácter ''#'' y finalizan con el final de la línea, como en 
 +
 +<code awk>
 +patron { acción } # Este es el comentario de la linea.
 +</code>
 ====Registros y Campos==== ====Registros y Campos====
  
Línea 36: Línea 50:
 Las variables ''FS'' y ''RS'' refieren al //separador de campo// y //separador de registro//. Estos pueden ser asignadas en cualquier momento por un único caracter. Por ejemplo, para asignar el caracter ''c'' como separador de campo en la variable ''FS'', se utiliza el argumento opcional de línea de comandos ''-Fc''. Las variables ''FS'' y ''RS'' refieren al //separador de campo// y //separador de registro//. Estos pueden ser asignadas en cualquier momento por un único caracter. Por ejemplo, para asignar el caracter ''c'' como separador de campo en la variable ''FS'', se utiliza el argumento opcional de línea de comandos ''-Fc''.
  
-En caso que el separador de registro esté vacío, se considera como separador de registro por defecto a una línea vacía, y los caracteres en blanco, tabuladores y nuevas líneas se consideran como separadores de campo por defecto.+En caso que el separador de registro esté vacío, se considera como separador de registro por defecto a una //línea vacía//, y los //separadores de campo// por defecto son los //caracteres en blanco// (''tabulación'' ''nuevas línea''se consideran como.
  
-La variable ''FILENAME'' contiene el nombre del fichero de entrada actual. +La variable ''FILENAME'' se utiliza para contener el nombre del fichero de entrada actual.
-====Uso básico====+
  
-Un ejemplo de un programa awk que imprime la tercera y segunda columna de una tabla en dicho orden: 
  
-<code awk>[print $3; $2]</code>+=====Patrones=====
  
-Este imprime todas las líneas de entradas con una A, B, o C en el segundo campo:+Un //patrón// en frente de una acción opera como un **semáforo que __determina si la acción debe ejecutarse__**. 
  
-<code awk>$2 ~/A|B|C/]</code> +Como patrón podrán utilizarse una variedad de expresiones de control: [[#expresiones regulares de awk|expresiones regulares]], [[#expresiones relacionales de awk|expresiones relacionales aritméticas]], expresiones de cadena, y combinaciones booleanas arbitrarias.
- +
-Este imprime todas las líneas en las cuales el primer campo es diferente que el primer campo previo: +
-<code awk>$2 ~/A|B|C/]</code>+
  
 +====Print====
  
- +La acción más simple consiste imprimir algo o todo de de un registro; esto se realiza con el comando ''print'' de awk.
-El comando  +
-<code awk>awk programa [ficheros]</code> +
-ejecuta los comandos de awk en la cadena ''programa'' sobre el conjunto de ficheros especificxados, o en la entrada estándar si no hubiese ficheros. La declaración también puede colocarse en un ''fichero_salida'' con el comando: +
- +
-<code awk>awk -f fichero_salida [ficheros]</code> +
- +
- +
-===Impresión=== +
- +
-Una acción puede carecer de patrón, en cuyo caso la acción se ejecutará para todas las líneas. La acción más simple es imprimir algo o todo de de un registro; esto se realiza con el comando ''print'' de awk.+
  
 El siguiente comando imprime todas los registros, copiando la entrada a la salida de forma intacta. El siguiente comando imprime todas los registros, copiando la entrada a la salida de forma intacta.
Línea 81: Línea 81:
 <code awk>{ print NR, NF, $0 }</code> <code awk>{ print NR, NF, $0 }</code>
  
-La salida puede divirise en múltiples ficheros, por ejemplo el programa siguiente escribe el primer campo ''$1'' en ''fichero1'' y el segundo campo en el ''fichero2''+La salida puede dividiise en múltiples ficheros, por ejemplo el programa siguiente escribe el primer campo ''$1'' en ''fichero1'' y el segundo campo en el ''fichero2''
  
 <code awk>{ print $1 >"fichero1"; print $2 >"fichero2" }</code> <code awk>{ print $1 >"fichero1"; print $2 >"fichero2" }</code>
Línea 98: Línea 98:
 envía por correo electrónico la salida a bwk. envía por correo electrónico la salida a bwk.
  
-Las variables ''OFS'' y ''ORS'' pueden utilizarse para cambiar el separador de campo de salida y el separador de registro de salida. El separador de registro de salida se agrega a la salida de la declaración print.+Las variables ''OFS'' y ''ORS'' pueden utilizarse para cambiar el separador de campo de salida y el separador de registro de salida. El separador de registro de salida se agrega a la salida de la declaración ''print''.
  
 Awk también provee a la declaración printf para formateado de salida, con esta sintaxis: Awk también provee a la declaración printf para formateado de salida, con esta sintaxis:
Línea 108: Línea 108:
 <code awk>printf "%8.2f %10ld\nm $1, $2</code> <code awk>printf "%8.2f %10ld\nm $1, $2</code>
  
-=====Patrones===== 
  
-Un patrón en frente de una acción opera como un **selector que determina si la acción debe ejecutarse**. Pueden utilizarse una variedad de expresiones como patrones: [[#expresiones regulares de awk|expresiones regulares]], [[#expresiones relacionales de awk|expresiones relacionales aritméticas]], expresiones de cadena, y combinaciones booleanas arbitrarias.+---- 
 +Un ejemplo de un programa awk que imprime la tercera y segunda columna de una tabla en dicho orden: 
 + 
 +<code awk>[print $3; $2]</code> 
 + 
 +Este imprime todas las líneas de entradas con una ''A'', ''B'', o ''C'' en el segundo campo: 
 + 
 +<code awk>$2 ~/A|B|C/]</code> 
 + 
 +Este imprime todas las líneas en las cuales el primer campo es diferente que el primer campo previo: 
 +<code awk>$2 ~/A|B|C/]</code>
  
  
Línea 157: Línea 166:
 El circunflejo ''ˆ'' refiere al comienzo de la línea o campo, mientras que el signo pesos ''$'' refderirá al final de línea o campo. El circunflejo ''ˆ'' refiere al comienzo de la línea o campo, mientras que el signo pesos ''$'' refderirá al final de línea o campo.
  
-===Expresiones Relacionales de awk === +====Expresiones Relacionales de awk ==== 
-Los patrones de awk pueden ser expresiones relacionales que incluyan los operadores relacionales convencionales ''<'', ''<='', ''=='', ''!='', ''>='', y ''>''. Un ejemplo es ''$2 > $1 + 100'' que seleccionará las líneas donde el segundo campo es al menos un ''100'' mayor que el primer campo. De forma similar,+Los patrones de awk pueden ser expresiones relacionales que incluyan los [[operadores en unix#operadores relacionales|operadores relacionales convencionales]] ''<'', ''<='', ''=='', ''!='', ''>='', y ''>''. Un ejemplo es ''$2 > $1 + 100'' que seleccionará las líneas donde el segundo campo es al menos un ''100'' mayor que el primer campo. De forma similar,
  
 <code awk>NF % 2 == 0</code> <code awk>NF % 2 == 0</code>
Línea 175: Línea 184:
  
  
-===Patrones Combinacionales=== +====Patrones Combinacionales==== 
-Un patrón puede ser cualquier patrones combinacinoal booleanos OR ''||'', AND ''&&'', y NOT ''!''+Un patrón puede ser cualquier operador [[operadores en unix#operadores lógicos|combinacinoal de lógica booleana]] OR ''||'', AND ''&&'', y NOT ''!''
  
 Por ejemplo, este programa de awk selecciona las líneas donde un primer campo comienza con ''p'', pero no sea ''perez''. El ''&&'' y el ''||'' garantizan que sus operandos sean evaluados de izquierda a derecha; la evaluación se detendrá tan pronto como se verifique verdad o falsedad. Por ejemplo, este programa de awk selecciona las líneas donde un primer campo comienza con ''p'', pero no sea ''perez''. El ''&&'' y el ''||'' garantizan que sus operandos sean evaluados de izquierda a derecha; la evaluación se detendrá tan pronto como se verifique verdad o falsedad.
Línea 182: Línea 191:
 <code awk>$1 >= "p" && $1 < "q" && $1 != "perez"</code> <code awk>$1 >= "p" && $1 < "q" && $1 != "perez"</code>
  
-===Rangos de Patrones===+====Rangos de Patrones====
  
 El ''patrón'' que selecciona una acción puede consistir de dos patrones separados por '','', siguiendo la sintaxis El ''patrón'' que selecciona una acción puede consistir de dos patrones separados por '','', siguiendo la sintaxis
Línea 214: Línea 223:
   * ''exit [expresión]'' (sale del procesado y realiza procesado ''END''; el status será ''expresión'')   * ''exit [expresión]'' (sale del procesado y realiza procesado ''END''; el status será ''expresión'')
  
-=== Funciones Incorporadas===+==== Funciones Incorporadas ====
 Awk incorpora la función ''lenght'' para computar la longitud de una cadena de caracteres. Este programa imprimirá cada registro, precedido por su longitud: Awk incorpora la función ''lenght'' para computar la longitud de una cadena de caracteres. Este programa imprimirá cada registro, precedido por su longitud:
  
Línea 243: Línea 252:
 ...pondrá la ''x'' a una cadena producida por el formateo de los valores de ''$1'' y ''$2''. ...pondrá la ''x'' a una cadena producida por el formateo de los valores de ''$1'' y ''$2''.
  
-=== Variables, Expresiones, y Asignaciones===+==== Variables, Expresiones, y Asignaciones====
  
 Las variables de awk toman valores numéricos (coma flotante) o cadenas alfabéticas de acuerdo al contexto. Por ejemplo, en ''x = 1'', ''x'' es claramente una cifra, mientras que en ''x = "perez"'' es claramente una cadena alfanumérica. Las cadenas se convierten a números y viceversa, toda vez que el contexto lo demande. Por ejemplo: Las variables de awk toman valores numéricos (coma flotante) o cadenas alfabéticas de acuerdo al contexto. Por ejemplo, en ''x = 1'', ''x'' es claramente una cifra, mientras que en ''x = "perez"'' es claramente una cadena alfanumérica. Las cadenas se convierten a números y viceversa, toda vez que el contexto lo demande. Por ejemplo:
Línea 251: Línea 260:
 ...asigna ''7'' a la ''x'' ...asigna ''7'' a la ''x''
  
-Las cadenas que no pueden ser intepretadas numéricamente en un contexto numérico generalmente tienen un valor numérico de ''0'', pero no suele ser adecuado contar siguiendo este comportamiento.+Las cadenas que no pueden ser interpretadas numéricamente en un contexto numérico generalmente tienen un valor numérico de ''0'', pero no suele ser adecuado contar siguiendo este comportamiento.
  
 Por defecto las demás variables que no son las incorporadas, deben inicializarse a una cadena nula, que tiene un valor numérico de ''0''; esto elimina la necesidad de la mayoría de las secciones de tipo ''BEGIN''. Por ejemplo, la sima de los primeros dos campos puede computarse con: Por defecto las demás variables que no son las incorporadas, deben inicializarse a una cadena nula, que tiene un valor numérico de ''0''; esto elimina la necesidad de la mayoría de las secciones de tipo ''BEGIN''. Por ejemplo, la sima de los primeros dos campos puede computarse con:
Línea 264: Línea 273:
 También están disponibles los operadores de C para incremento ''++'' y decremento ''––'', así como los operadores de asignación ''+='', ''–='', ''∗='', ''/='', y ''%=''. Estos operadores pueden utilizarse en las expresiones. También están disponibles los operadores de C para incremento ''++'' y decremento ''––'', así como los operadores de asignación ''+='', ''–='', ''∗='', ''/='', y ''%=''. Estos operadores pueden utilizarse en las expresiones.
  
-===Variables de Campo===+====Variables de Campo====
 Los campos en awk comparten esencialmente todas las propiedades de las variables: pueden usarse en aritmética u operaciones de cadenas, y también pueden ser asignados. Por lo tanto puede reemplazarse el primer campo con un número de secuencia: Los campos en awk comparten esencialmente todas las propiedades de las variables: pueden usarse en aritmética u operaciones de cadenas, y también pueden ser asignados. Por lo tanto puede reemplazarse el primer campo con un número de secuencia:
  
Línea 296: Línea 305:
 ...divide la cadena ''c'' en un arreglo[1], ..., arreglo[n]. El número de elementros encontrados resulta devuelto. Si se provee el argumento ''sep'', se utiliza como separador de campo; de otra forma se usa como separador ''FS''. ...divide la cadena ''c'' en un arreglo[1], ..., arreglo[n]. El número de elementros encontrados resulta devuelto. Si se provee el argumento ''sep'', se utiliza como separador de campo; de otra forma se usa como separador ''FS''.
  
-===Concatenación de cadenas===+====Concatenación de cadenas====
 Las cadenas pueden concatenarse. Por ejemplo: Las cadenas pueden concatenarse. Por ejemplo:
  
Línea 307: Línea 316:
 ...imprime los dos campos separados por ''" es "''. Las variables y expresiones numéricas también pueden aparecer en las concatenaciones. ...imprime los dos campos separados por ''" es "''. Las variables y expresiones numéricas también pueden aparecer en las concatenaciones.
  
-===Arreglos de awk===+====Arreglos de awk====
 Los elementos de los //arreglos// de awk no necesitan ser declarados; activan su existencia simplemente por ser mencionados. Los subscriptos pueden tener cualquier valor no nulo, incluyendo cadenas no numéricas. Como ejemplo de un subscripto convencional, la declaración Los elementos de los //arreglos// de awk no necesitan ser declarados; activan su existencia simplemente por ser mencionados. Los subscriptos pueden tener cualquier valor no nulo, incluyendo cadenas no numéricas. Como ejemplo de un subscripto convencional, la declaración
  
Línea 333: Línea 342:
 </code> </code>
  
-=== Declaraciones de control de flujo ===+==== Declaraciones de control de flujo ====
  
 Como en el lenguaje C, Awk ofrece las declaraciones básicas de control de flujo ''if-else'', ''while'', ''for'', y el agrupado de declaraciones con llaves ''{}'' Como en el lenguaje C, Awk ofrece las declaraciones básicas de control de flujo ''if-else'', ''while'', ''for'', y el agrupado de declaraciones con llaves ''{}''
Línea 372: Línea 381:
 La declaración ''next'' provoca que awk saltee inmediatamente al segundo registro y cominece a analizar los patrones desde el inicio. La declaración ''exit'' provoca que el programa se comporte como si hubiese ocurrido la finalización de la entrada. La declaración ''next'' provoca que awk saltee inmediatamente al segundo registro y cominece a analizar los patrones desde el inicio. La declaración ''exit'' provoca que el programa se comporte como si hubiese ocurrido la finalización de la entrada.
  
-Pueden disponerse comentarios en los programas de awk: comienzan con el caracter ''#'' y finalizan con el final de la línea, como en  
  
-<code awk> 
-print x, y # Esto es un comentario de línea. 
-</code> 
  
  
  
  • awk.1681263511.txt.gz
  • Última modificación: 2023/04/12 01:38
  • por peron