mawk
(e nawk
) fornecem apenas arrays multidimensionais sintetizados .
gawk
fornece (desde 4.0, thx manatwork ) matrizes multidimensionais verdadeiras, embora a página de manual (IMHO) desvie um pouco: imediatamente após a introdução de (corrigido desde a 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 uma matriz. "
Mas, for ((i,j) in array)
não é o caminho para iterar sobre estes, o gawk
way é (como você usou originalmente):
for (i in array)
for (j in array[i])
print array[i][j]
Com nawk
/ mawk
você está preso a matrizes multidimensionais sintetizadas ,
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á ordenar , os índices de matriz são implicitamente do tipo string e os arrays são implicitamente desordenados. A menos que você tenha um conhecimento separado dos índices, como seria o caso de uma matriz simples não esparsa com índices inteiros consecutivos de 0..N. gawk
oferece uma solução para um in
ordenado .
Se você conhece os índices de um array sintetizado, pode usar A[i,j]
(que é tratado como A[i SUBSEP j]
) ou for
/ in
e alguma divisão de strings para reconstruir a lista de i
e j
, ou if ((i,j) in A)
(teste de presença, sem autovivificação de índices).
Em gawk
você não pode usar (i,j) in arr
onde arr é um verdadeiro array multidimensional, você precisa dividi-lo em duas (ou quantas dimensões) for
loops como acima. Para estar completamente correto, porém, o (s) laço (s) interno (s) deve conter uma condição isarray()
, já que não é necessário que cada elemento de arr[i]
seja um array, o gawk está feliz em permitir escalares também.
Não conheço nenhuma documentação específica de mawk
além da página de manual , que pretende ser uma nova implementação padrão de awk
(ou seja, nawk
) (portanto, não há matrizes multidimensionais verdadeiras, nenhuma classificação de índice e nenhum isarray()
).