Durchlaufen mehrdimensionaler Arrays in Mawk

Durchlaufen mehrdimensionaler Arrays in Mawk

Ich kann dies in Gawk richtig machen, aber als ich versuchte, meinen Code auf dem Computer zu posten, auf dem er ausgeführt wird, stellte ich fest, dass er Mawk verwendete ...

$ 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

anscheinend hat mawk eine andere Vorstellung davon, wie mehrdimensionale Arrays funktionieren sollten. Wenn ich es unter Debian mit mawk ausführe, erhalte ich einen Syntaxfehler. A[i,j] scheint die richtige Syntax zu sein und es „synthetisiert“ mehrdimensionale Arrays.

Also habe ich zwei Dinge versucht, beides hat nicht funktioniert:

$ 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 [

Erscheint sinnvoll, die Verwendung eines 1-dimensionalen Array-Index auf einem „mehrdimensionalen“ Array erzeugt einen Fehler.

Ich versuche, einfach das GESAMTE Array zu durchlaufen, damit ich mit einer if-Anweisung sogar die erste Dimension auswählen kann (extrem ineffizient und schrecklich) … aber nicht einmal das gelingt mir!:

$ 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 )

Gibt es eine Möglichkeit, ein mehrdimensionales Array in Mawk zu durchlaufen?

Gibt es außer der Mawk-Manpage eine andere Sprachreferenz?

Danke!

Antwort1

mawk(und nawk) bieten nursynthetisierte mehrdimensionale Arrays.

gawkbietet (seit 4.0, thxMann bei der Arbeit) echte mehrdimensionale Arrays, obwohl die Manpage (meiner Meinung nach) ein wenig in die Irre führt: unmittelbar nach der Einführung if ((i,j) in array)folgt "Die In-Konstruktion kann auch in einer For-Schleife verwendet werden, um über alle Elemente eines Arrays zu iterieren." (behoben seit v4.1.1!).

Dies ist jedoch for ((i,j) in array)nicht die Art und Weise, diese zu durchlaufen, sondern die folgende gawk(von Ihnen ursprünglich verwendete) Art und Weise:

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

Mit nawk/ mawkdu steckst fest mitsynthetisierte mehrdimensionale Arrays, Also

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

Ihr nächstes Problem wird seinBestellung, Array-Indizes sind implizit vom Typ String und Arrays sind implizit ungeordnet. Sofern Sie nicht über separate Kenntnisse der Indizes verfügen, wie dies bei einem einfachen nicht-spärlichen Array mit aufeinanderfolgenden ganzzahligen Indizes von 0..N der Fall wäre, gawkbieteteine Lösung für eine geordnetein.

Wenn Sie die Indizes eines synthetisierten Arrays kennen, können Sie A[i,j](das als behandelt wird A[i SUBSEP j]) oder for/ inund eine Zeichenfolgenaufteilung verwenden, um die Liste von iund neu zu erstellen j, oder if ((i,j) in A)(auf Vorhandensein testen, ohneAutovivifizierungvon Indizes).

Wenn gawkSie „where arr is a true multi-dimensional array“ nicht verwenden können (i,j) in arr, müssen Sie es forwie oben in zwei (oder beliebig viele Dimensionen) Schleifen aufteilen. Um jedoch vollständig korrekt zu sein, sollten die inneren Schleifen eine isarray()Bedingung enthalten, da es nicht erforderlich ist, dass jedes Element arr[i]wiederum ein Array ist. Gawk lässt auch gerne Skalare zu.

Mir ist keine spezifische Dokumentation bekannt mawkaußerdie Manpageawk, es soll eine neue Standardimplementierung (d. h. ) sein nawk(also keine echten mehrdimensionalen Arrays, keine Indexsortierung und keine isarray()).

verwandte Informationen