Dado un string que representa una matriz de números, devuelve las filas y las columnas de esa matriz.
Así, dado un string con saltos de línea incrustados como este:
9 8 7
5 3 2
6 6 7
que representa esta matriz:
1 2 3
|---------
1 | 9 8 7
2 | 5 3 2
3 | 6 6 7
tu código debería poder darte:
Las filas de nuestra matriz de ejemplo:
Y sus columnas:
Este es el primer ejercicio donde la solución no es un script «main». El objetivo es escribir una biblioteca de funciones que se puedan incluir en otros programas de awk. En este ejercicio hay varios conceptos nuevos e interesantes que ver.
Las siguientes secciones marcadas con «(gawk)» son extensiones específicas de GNU awk.
En este ejercicio vas a leer datos de un archivo, no del flujo de entrada principal.
Lee sobre getline en el manual de Gnu awk,
en particular las formas Getline/File y Getline/Variable/File.
Un array bidimensional podría ser una forma de implementar esta solución. GNU awk tiene dos formas de representarlo:
Fíjate en la directiva @include del archivo de pruebas.
Esto le indica a gawk que lea y evalúe el archivo nombrado.
Todas las variables de awk son globales (excepto los parámetros de una función, que son locales a la función).
Hay una gran probabilidad de colisiones de nombres, sobre todo cuando se incluyen bibliotecas de terceros.
Los espacios de nombres son una forma de delimitar dónde se almacenan las variables.
Fíjate en la directiva @namespace en los archivos del ejercicio.
El espacio de nombres predeterminado se llama «awk». Tener un espacio de nombres predeterminado permite que quien programa llame a una función integrada de awk desde dentro de una función que está en otro espacio de nombres.
Los parámetros de tipo array se pasan por referencia. Los cambios que se hagan al array dentro de la función son visibles para quien la llamó.
Los parámetros que no son arrays se pasan por valor.
Para los parámetros sin tipo, depende de lo que la función haga con ellos:
Encontrarás todos los detalles en el manual, en Paso de argumentos de función por valor o por referencia.
Las variables locales (con ámbito de función) se pueden crear usando parámetros «por valor». No es un error pasar a una función menos valores que el número de parámetros listados; los parámetros sobrantes quedan «sin tipo» hasta que se usen. Están disponibles para que se les asignen valores escalares dentro de la función que no se almacenan en el espacio de nombres global.
Por convención, en la firma de la función primero aparecen los parámetros esperados, luego un espacio en blanco y después los parámetros locales. Un ejemplo:
function add(a, b, total) {
# here, `typeof(total)` is "untyped"
total = a + b
# now, `typeof(total)` is "number"
return total
}
BEGIN {
sum = add(5, 10)
print sum # 15
print typeof(total) # untyped, meaning "total" is unused in this scope
}
Regístrate en Exercism para aprender y dominar AWK con 3 conceptos92 ejercicios y mentoría humana real, todo gratis.