Caminando por matrices multidimensionales en Mawk

Caminando por matrices multidimensionales en Mawk

Puedo hacer esto correctamente en gawk, pero cuando intenté publicar mi código en la máquina donde se ejecutará, me di cuenta de que estaba usando mawk...

$ cat multidim.gawk
# test of multidimensional arrays
// {
        A[1][1]="A11"
        A[1][2]="A12"
        A[2][1]="A21"
        A[2][2]="A22"

        i=2
        for ( j in A[i] )
        {
                print "i=" i " j=" j " A[i][j]=" A[i][j]
        }
}


$ echo hi | awk -f multidim.gawk
i=2 j=1 A[i][j]=A21
i=2 j=2 A[i][j]=A22

Parece que Mawk tiene una idea diferente sobre cómo deberían funcionar las matrices multidimensionales. Cuando lo ejecuto en Debian con mawk, aparece un error de sintaxis. A[i,j] parece la sintaxis correcta y "sintetiza" matrices multidimensionales.

Entonces probé dos cosas, ninguna funciona:

$ cat multidim.mawk
// {
        A[1,1]="A11"
        A[1,2]="A12"
        A[2,1]="A21"
        A[2,2]="A22"

        i=2
        for ( j in A[i] )
        {
                print "i=" i " j=" j "a[i,j]=" a[i,j]
        }
}

$ echo hi | awk -f multidim.mawk 
awk: multidim.mawk: line 9: syntax error at or near [

Parece sensato, usar un índice de matriz 1dim en una matriz "multidimensional" genera un error.

Intento simplemente recorrer TODA la matriz para poder usar una declaración if para seleccionar incluso la primera dimensión (extremadamente ineficiente y horrible)... ¡pero ni siquiera puedo hacer eso!:

$ cat multidim2.mawk
# test of multidimensional arrays
// { 
    A[1,1]="A11"    
    A[1,2]="A12"    
    A[2,1]="A21"    
    A[2,2]="A22"    

    for ( (i, j) in A )
    {
        print "i=" i " j=" j "a[i,j]=" a[i,j]
    }
}
$ echo hi | awk -f multidim2.mawk 
awk: multidim2.mawk: line 8: syntax error at or near )

¿Hay alguna forma de recorrer una matriz multidimensional en mawk?

¿Existe alguna referencia de idioma además de la página de manual de mawk?

¡Gracias!

Respuesta1

mawk(y nawk) proporcionar sólomatrices multidimensionales sintetizadas.

gawkproporciona (desde 4.0, graciashombre trabajando) verdaderas matrices multidimensionales, aunque la página de manual (en mi humilde opinión) desvía un poco: inmediatamente después de introducirla if ((i,j) in array)sigue con "La construcción in también se puede utilizar en un bucle for para iterar sobre todos los elementos de una matriz." (¡corregido desde v4.1.1!).

Pero for ((i,j) in array)no es la forma de iterar sobre estos, la gawkforma es (como usaste originalmente):

 for (i in array)
     for (j in array[i])
         print array[i][j]

Con nawk/ mawkestás atrapado conmatrices multidimensionales sintetizadas, entonces

for (ij in A) {
    split(ij,xx,SUBSEP);
    printf("A[%s,%s]=%s\n",xx[1],xx[2],A[ij])
}

Ahora, tu próximo problema seráordenar, los índices de las matrices son implícitamente de tipo cadena y las matrices están implícitamente desordenadas. A menos que tenga un conocimiento separado de los índices, como sería el caso de una matriz simple no dispersa con índices enteros consecutivos desde 0..N. gawkofertasuna solución para un pedidoin.

Si conoce los índices de una matriz sintetizada, puede usar A[i,j](que se trata como A[i SUBSEP j]), o for/ iny alguna división de cadenas para reconstruir la lista de iy j, o if ((i,j) in A)(prueba de presencia, sinautovivificaciónde índices).

Si gawkno puede usar (i,j) in arrdonde arr es una verdadera matriz multidimensional, debe dividirla en dos forbucles (o en tantas dimensiones) como se indicó anteriormente. Sin embargo, para ser completamente correcto, los bucles internos deben contener una isarray()condición, ya que no es necesario que cada elemento arr[i]sea a su vez una matriz, gawk se complace en permitir escalares también.

No conozco ninguna mawkdocumentación específica aparte dela página de manual, pretende ser una implementación nueva awk(es decir, nawk) estándar (por lo que no hay verdaderas matrices multidimensionales, ni clasificación de índices ni isarray()).

información relacionada