Awk предлагает ассоциативную индексацию для обработки матриц. Элементы 1 размерного массива могут быть выполнены с помощью итераций:
например.
for(index in arr1)
print "arr1[" index "]=" arr1[index]
Но как этот вид, сделанный для двумерной матрицы? Вид синтаксиса, данного ниже работы?
for(index1 in arr2)
for(index2 in arr2)
arr2[index1,index2]
AWK подделывает многомерные массивы, объединяя индексы с символом, содержащимся в переменной SUBSEP (0x1c).Вы можете перебирать двумерный массив, используя split
следующим образом (на основе примера в файле info gawk
):
awk 'BEGIN { OFS=","; array[1,2]=3; array[2,3]=5; array[3,4]=8;
for (comb in array) {split(comb,sep,SUBSEP);
print sep[1], sep[2], array[sep[1],sep[2]]}}'
Вывод:
2,3,5
3,4,8
1,2,3
Однако вы можете, перебирать массив с числовым индексом, используя вложенные циклы for:
for (i = 1; i <= width; i++)
for (j = 1; j < = height; j++)
print array[i, j]
Еще одна важная информация из руководства GAWK :
Чтобы проверить, существует ли определенная последовательность индексов в многомерном массиве, используйте тот же оператор (in), который используется для одномерных массивов. Запишите всю последовательность индексов в скобках, разделенных запятыми, в качестве левого операнда:
(индекс1, индекс2, ...) в массиве
Gawk 4 добавляет массивов массивов . По этой ссылке:
for (i in array) {
if (isarray(array[i])) {
for (j in array[i]) {
print array[i][j]
}
}
else
print array[i]
}
Также см. Обход массивов массивов для получения информации о следующей функции, которая обходит массив массивов произвольного размера, включая зубчатые:
function walk_array(arr, name, i)
{
for (i in arr) {
if (isarray(arr[i]))
walk_array(arr[i], (name "[" i "]"))
else
printf("%s[%s] = %s\n", name, i, arr[i])
}
}
Нет, синтаксис
for(index1 in arr2) for(index2 in arr2) {
print arr2[index1][index2];
}
работать не будет. Awk действительно не поддерживает многомерные массивы. Если вы сделаете что-то вроде
x[1,2] = 5;
, он объединит два индекса (1 и 2) в строку, разделенную значением переменной SUBSEP
. Если он равен «*», то вы получите тот же эффект, что и
x["1*2"] = 5;
. Значение по умолчанию SUBSEP
- непечатаемый символ, соответствующий Ctrl + \. Вы можете увидеть это с помощью следующего скрипта:
BEGIN {
x[1,2]=5;
x[2,4]=7;
for (ix in x) {
print ix;
}
}
Выполнение этого дает:
% awk -f scriptfile | cat -v
1^\2
2^\4
Итак, в ответ на ваш вопрос - как выполнить итерацию многомерного массива - просто используйте единственный для (a in b)
, но вам может потребоваться дополнительная работа, чтобы разделить a
на его части x
и y
.