
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.
gawk
bietet (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 (behoben seit v4.1.1!).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."
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
/ mawk
du 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, gawk
bieteteine 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
/ in
und eine Zeichenfolgenaufteilung verwenden, um die Liste von i
und neu zu erstellen j
, oder if ((i,j) in A)
(auf Vorhandensein testen, ohneAutovivifizierungvon Indizes).
Wenn gawk
Sie „where arr is a true multi-dimensional array“ nicht verwenden können (i,j) in arr
, müssen Sie es for
wie 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 mawk
außerdie Manpageawk
, es soll eine neue Standardimplementierung (d. h. ) sein nawk
(also keine echten mehrdimensionalen Arrays, keine Indexsortierung und keine isarray()
).