Awk выстраивают повторение для многомерных массивов

Awk предлагает ассоциативную индексацию для обработки матриц. Элементы 1 размерного массива могут быть выполнены с помощью итераций:

например.

for(index in arr1)
  print "arr1[" index "]=" arr1[index]

Но как этот вид, сделанный для двумерной матрицы? Вид синтаксиса, данного ниже работы?

for(index1 in arr2)
for(index2 in arr2)
   arr2[index1,index2]     
19
задан cobp 17 June 2010 в 09:55
поделиться

2 ответа

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])
    }
} 
36
ответ дан 30 November 2019 в 02:41
поделиться

Нет, синтаксис

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 .

6
ответ дан 30 November 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: