
Consigo fazer isso corretamente no gawk, mas quando tentei postar meu código na máquina onde ele será executado, percebi que estava usando o 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 tem uma ideia diferente sobre como os arrays multidimensionais devem funcionar. Quando executo no Debian com mawk, recebo um erro de sintaxe. A[i,j] parece a sintaxe correta e 'sintetiza' matrizes multidimensionais.
Então tentei duas coisas, nenhuma funcionou:
$ 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 um índice de array 1dim em um array "multidimensional" gera um erro.
Tentando apenas percorrer o array TODO para que eu possa usar uma instrução if para selecionar a primeira dimensão mesmo (extremamente ineficiente e horrível)... mas não consigo fazer isso!:
$ 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 )
Existe alguma maneira de percorrer um array multidimensional no mawk?
Existe uma referência de idioma diferente da página de manual do mawk?
Obrigado!
Responder1
mawk
(e nawk
) fornecem apenasmatrizes multidimensionais sintetizadas.
gawk
fornece (desde 4.0, obrigadohomem a trabalhar) verdadeiras matrizes multidimensionais, embora a página de manual (IMHO) erre um pouco: imediatamente após a introdução (corrigido desde v4.1.1!).if ((i,j) in array)
segue com "A construção in também pode ser usada em um loop for para iterar todos os elementos de um array."
Mas for ((i,j) in array)
não é a maneira de iterar sobre eles, a gawk
maneira é (como você usou originalmente):
for (i in array)
for (j in array[i])
print array[i][j]
Com nawk
/ mawk
você está preso commatrizes multidimensionais sintetizadas, então
for (ij in A) {
split(ij,xx,SUBSEP);
printf("A[%s,%s]=%s\n",xx[1],xx[2],A[ij])
}
Agora, seu próximo problema seráencomenda, os índices de array são implicitamente do tipo string e os arrays são implicitamente não ordenados. A menos que você tenha conhecimento separado dos índices, como seria o caso de uma matriz simples e não esparsa com índices inteiros consecutivos de 0..N. gawk
ofertasuma solução para um pedidoin
.
Se você conhece os índices de um array sintetizado, então você pode usar A[i,j]
(que é tratado como A[i SUBSEP j]
), ou for
/ in
e alguma divisão de string para reconstruir a lista de i
e j
, ou if ((i,j) in A)
(teste de presença, semautovivificaçãode índices).
Como gawk
você não pode usar (i,j) in arr
onde arr é uma matriz multidimensional verdadeira, é necessário dividi-la em dois (ou quantas dimensões) for
loops como acima. Para estar totalmente correto, porém, o(s) loop(s) interno(s) deve(m) conter uma isarray()
condição, uma vez que não é necessário que cada elemento de arr[i]
por sua vez seja um array, o gawk também tem prazer em permitir escalares.
Não conheço nenhuma mawk
documentação específica aléma página de manual, ele pretende ser uma nova implementação padrão awk
(ou seja, nawk
) (portanto, sem matrizes multidimensionais verdadeiras, sem classificação de índice e sem isarray()
).