Как мы делаем массивы в awk? - PullRequest
0 голосов
/ 04 декабря 2018
{
    k = 0
    x = 0
    fracon = (10/2)+1
    {
        for (j = 1; j <= 1100 ; j++)
        {
            if (j <= fracon)
                scal[j]= j-x

            else
                k= k + 1
            scal[j]= j - (2*k)
            {
                if (scal[j] == 1)
                    fracon= fracon+11
                {
                    if (j % 11 == 0)
                        x=x+11
                    k=k+0.5
                }
            }
        }
    }
}

Вот и все.Я использовал приведенный выше код для генерации следующего массива.Он работает в Matlab, но не работает в awk.

array= [1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6]

1 Ответ

0 голосов
/ 04 декабря 2018

вот еще один способ генерации той же последовательности

$ awk 'BEGIN{for(i=0;i<=20;i++) {k=i%11+1; printf "%s ", (k<7?k:12-k)}; print ""}'

1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6 5 4 3 2 

, не уверенный, что то, что вы хотите, просто повторяется в цикле из 11 элементов или нет;трудно сказать на основании ограниченной выборки.

или без awk

$  yes $({ seq 6; seq 5 -1 1; } | paste -sd' ') | head -100 | paste -sd' '

1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6 5 4 3 2 1 ...

с квадратными скобками

$ awk 'BEGIN{printf "["; 
             for(i=0;i<=1100;i++) {k=i%11+1; printf "%s ", (k<7?k:12-k)}; 
             printf "]\n"}'

[1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6 ... 5 4 3 2 1 ]

Заполнение этих значений в большой массив не является оптимальнымВы можете написать функцию, которая будет легко возвращать индексированное значение

$ awk 'function k(i,_i) {_i=i%11+1; return _i<7?_i:12-_i}  
       BEGIN{for(i=0;i<=25;i++) print k(i)}'

в реальном коде, вместо печати вы будете использовать k(i).Обратите внимание, что индекс массива начинается с 0.

Примечание: _i является локальной переменной в функции awk;вам не нужно использовать синтаксис вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...