Awk es un lenguaje de secuencias de comandos utilizado para manipular datos y generar informes. El lenguaje de programación de comandos awk no requiere compilación y permite al usuario usar variables, funciones numéricas, funciones de string y operadores lógicos.
Awk es una utilidad que permite a un programador escribir programas pequeños pero efectivos en forma de declaraciones que definen patrones de texto que se buscarán en cada línea de un documento y la acción que se tomará cuando se encuentre una coincidencia dentro de un línea. Awk se utiliza principalmente para escanear y procesar patrones. Busca uno o más archivos para ver si contienen líneas que coincidan con los patrones especificados y luego realiza las acciones asociadas.
Awk se abrevia a partir de los nombres de los desarrolladores: Aho, Weinberger y Kernighan.
¿QUÉ PODEMOS HACER CON AWK?
1. Operaciones AWK:
(a) Escanea un archivo línea por línea
(b) Divide cada línea de entrada en campos
(c) Compara la línea/campos de entrada con el patrón
(d) Realiza acciones en líneas coincidentes
2. Útil para:
(a) Transformar archivos de datos
(b) Producir informes formateados
3. Construcciones de programación:
(a) Formato de líneas de salida
(b) Operaciones aritméticas y de strings
(c) Condicionales y bucles
Sintaxis:
awk options 'selection _criteria {action }' input-file > output-file
Opciones:
-f program-file : Reads the AWK program source from the file program-file, instead of from the first command line argument. -F fs : Use fs for the input field separator
Comandos de muestra
Ejemplo:
Considere el siguiente archivo de texto como el archivo de entrada para todos los casos a continuación:
$cat > employee.txt
ajay manager account 45000 sunil clerk account 25000 varun manager sales 50000 amit manager account 47000 tarun peon sales 15000 deepak clerk sales 23000 sunil peon sales 13000 satvik director purchase 80000
1. Comportamiento predeterminado de Awk: por defecto, Awk imprime cada línea de datos del archivo especificado.
$ awk '{print}' employee.txt
Producción:
ajay manager account 45000 sunil clerk account 25000 varun manager sales 50000 amit manager account 47000 tarun peon sales 15000 deepak clerk sales 23000 sunil peon sales 13000 satvik director purchase 80000
En el ejemplo anterior, no se da ningún patrón. Entonces las acciones son aplicables a todas las líneas. La acción imprimir sin ningún argumento imprime la línea completa de forma predeterminada, por lo que imprime todas las líneas del archivo sin fallar.
2. Imprime las líneas que coinciden con el patrón dado.
$ awk '/manager/ {print}' employee.txt
Producción:
ajay manager account 45000 varun manager sales 50000 amit manager account 47000
En el ejemplo anterior, el comando awk imprime toda la línea que coincide con el ‘administrador’.
3. Dividir una línea en campos: para cada registro, es decir, línea, el comando awk divide el registro delimitado por un carácter de espacio en blanco de forma predeterminada y lo almacena en las variables $n. Si la línea tiene 4 palabras, se almacenará en $1, $2, $3 y $4 respectivamente. Además, $0 representa la línea completa.
$ awk '{print $1,$4}' employee.txt
Producción:
ajay 45000 sunil 25000 varun 50000 amit 47000 tarun 15000 deepak 23000 sunil 13000 satvik 80000
En el ejemplo anterior, $1 y $4 representan los campos Nombre y Salario respectivamente.
Variables incorporadas en Awk
Las variables integradas de Awk incluyen las variables de campo: $1, $2, $3, etc. ($0 es la línea completa), que dividen una línea de texto en palabras individuales o partes llamadas campos.
- NR: el comando NR mantiene un recuento actual del número de registros de entrada. Recuerde que los registros suelen ser líneas. El comando Awk realiza las declaraciones de patrón/acción una vez para cada registro en un archivo.
- NF: el comando NF mantiene un recuento del número de campos dentro del registro de entrada actual.
- FS: El comando FS contiene el carácter separador de campo que se usa para dividir campos en la línea de entrada. El valor predeterminado es «espacio en blanco», es decir, espacios y tabuladores. FS se puede reasignar a otro carácter (típicamente en BEGIN) para cambiar el separador de campo.
- RS: El comando RS almacena el carácter separador de registro actual. Dado que, de forma predeterminada, una línea de entrada es el registro de entrada, el carácter separador de registro predeterminado es una nueva línea.
- OFS: el comando OFS almacena el separador de campo de salida, que separa los campos cuando Awk los imprime. El valor predeterminado es un espacio en blanco. Siempre que print tenga varios parámetros separados por comas, imprimirá el valor de OFS entre cada parámetro.
- ORS: el comando ORS almacena el separador de registros de salida, que separa las líneas de salida cuando Awk las imprime. El valor predeterminado es un carácter de nueva línea. print genera automáticamente el contenido de ORS al final de lo que se le da para imprimir.
Ejemplos:
Uso de variables integradas de NR (Número de línea de visualización)
$ awk '{print NR,$0}' employee.txt
Producción:
1 ajay manager account 45000 2 sunil clerk account 25000 3 varun manager sales 50000 4 amit manager account 47000 5 tarun peon sales 15000 6 deepak clerk sales 23000 7 sunil peon sales 13000 8 satvik director purchase 80000
En el ejemplo anterior, el comando awk con NR imprime todas las líneas junto con el número de línea.
Uso de variables integradas de NF (Mostrar último campo)
$ awk '{print $1,$NF}' employee.txt
Producción:
ajay 45000 sunil 25000 varun 50000 amit 47000 tarun 15000 deepak 23000 sunil 13000 satvik 80000
En el ejemplo anterior, $1 representa el Nombre y $NF representa el Salario. Podemos obtener el Salario usando $NF, donde $NF representa el último campo.
Otro uso de las variables integradas de NR (Línea de visualización de 3 a 6)
$ awk 'NR==3, NR==6 {print NR,$0}' employee.txt
Producción:
3 varun manager sales 50000 4 amit manager account 47000 5 tarun peon sales 15000 6 deepak clerk sales 23000
Más ejemplos
Para el archivo de texto dado:
$cat > geeksforgeeks.txt A B C Tarun A12 1 Man B6 2 Praveen M42 3
1) Para imprimir el primer elemento junto con el número de fila (NR) separado con «-» de cada línea en geeksforgeeks.txt:
$ awk '{print NR "- " $1 }' geeksforgeeks.txt
1 - A 2 - Tarun 3 – Manav 4 - Praveen
2) Para devolver la segunda columna/elemento de geeksforgeeks.txt:
La pregunta debería ser: – Para devolver la segunda columna/elemento de geeksforgeeks.txt:
$ awk '{print $2}' geeksforgeeks.txt
B A12 B6 M42
3) Para imprimir cualquier línea no vacía si está presente
$ awk 'NF < 0' geeksforgeeks.txt
aquí NF debe ser 0 no menor que y el usuario también debe imprimir el número de línea:
respuesta correcta: awk ‘NF == 0 {print NR}’ geeksforgeeks.txt
O
awk ‘NF <= 0 {imprimir NR}’ geeksforgeeks.txt
0
4) Para encontrar la longitud de la línea más larga presente en el archivo:
$ awk '{ if (length($0) > max) max = length($0) } END { print max }' geeksforgeeks.txt
13
5) Para contar las líneas en un archivo:
$ awk 'END { print NR }' geeksforgeeks.txt
3
6) Líneas de impresión con más de 10 caracteres:
$ awk 'length($0) > 10' geeksforgeeks.txt
Tarun A12 1 Praveen M42 3
7) Para buscar/verificar cualquier string en cualquier columna específica:
$ awk '{ if($3 == "B6") print $0;}' geeksforgeeks.txt
8) Para imprimir los cuadrados de los primeros números del 1 al n, diga 6:
$ awk 'BEGIN { for(i=1;i<=6;i++) print "square of", i, "is",i*i; }'
square of 1 is 1 square of 2 is 4 square of 3 is 9 square of 4 is 16 square of 5 is 25 square of 6 is 36
Este artículo es una contribución de Anshika Goyal y Praveen Negi . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA