URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8205
[ Назад ]

Исходное сообщение
"работа с массивами в awk"

Отправлено nastr , 08-Апр-09 14:07 
Есть скрипт на awk, раньше я использовал просто вывод строк (print), теперь, для дополнительного сравнения строк мне понадобилось использовать массивы.
Подскажите пожалуйста как правильно инициализировать массивы в awk, как правильно заносить в массив значение и как провести сравнение массивов?
Тело скрипта:
awk '{
b = index($0, "error#:");
c = substr($0,index($0,":")+1);
d = substr(j, 1, 10);
f = substr(c, 12, 8);
g = substr($0, b+7);
i = sprintf(strftime("%Y.%m.") sprintf("%02i", strftime("%d")-1));
j = strftime("%Y.%m.%d %H:%M:%S| ", substr(c, 1, 10));
k = strftime("%Y.%m.%d");
l = index(substr(c,1,2), "12");
m = index(substr(c,1,2), "20");
if (b)
{
    if (l || m)
    {
        if (e == k || e == i || d == k || d == i)
        {
            if (l)
            {
                arrey[n]=j g
            }
            else
            {
                arrey[n]=e " " f "| " g
            }
        }
    }
    else
    {
    arrey[o]="    .  .     .  .  | " g
    }
print arrey[n]
    ?????
    {
    print arrey[o]
    }
}
}' $file


Вот что должен делать скрипт:
если файл содержит строки содержащие error#:
{
    если строки начинаются с 12 или 20
    {
            если дата равна сегодняшней или вчерашней дате
        {
            если строка начинается с 12
            {
                        занести строку в массив N
            }
                    else
            {
                        занести строку в массив N
            }
            }
    }
        else
    {
            занести строку в массив O # не содержит информации о дате
    }
print весь масив N

    если второе поле (в данном случае g) строки из массива О не совпадает со вторым полем (g) строки в массива N
    {
        print строку из массива O
    }
}


Содержание

Сообщения в этом обсуждении
"работа с массивами в awk"
Отправлено Pahanivo , 08-Апр-09 21:25 
awk конечно позволяет некий скриптинг как и многоие консольные тулзы - но возмите лучше перл - быстрей, понятней, универсальней - там это все делается как два байта написать да и людей побольше которые захотят пообсуждать код на перле чем скрипты на awk )


"работа с массивами в awk"
Отправлено allez , 09-Апр-09 06:39 
>awk конечно позволяет некий скриптинг как и многоие консольные тулзы - но
>возмите лучше перл - быстрей, понятней, универсальней - там это все
>делается как два байта написать да и людей побольше которые захотят
>пообсуждать код на перле чем скрипты на awk )

Ну да, особенно если учесть, что AWK - это скриптовый язык, то было бы несколько странно, если бы он
не позволял "некий скриптинг". :-) Насчет Perl согласен целиком и полностью.

Автору темы: а что мешает вам заглянуть хотя бы в man awk?


Arrays
       Arrays are subscripted with an expression between  square  brackets  ([
       and ]).  If the expression is an expression list (expr, expr ...)  then
       the array subscript is a string consisting of the concatenation of  the
       (string) value of each expression, separated by the value of the SUBSEP
       variable.  This facility  is  used  to  simulate  multiply  dimensioned
       arrays.  For example:
              i = "A"; j = "B"; k = "C"
              x[i, j, k] = "hello, world\n"
       assigns the string "hello, world\n" to the element of the array x which
       is indexed by the string "A\034B\034C".  All arrays in AWK are associa‐
       tive, i.e. indexed by string values.
       The  special  operator  in may be used to test if an array has an index
       consisting of a particular value.
              if (val in array)
                   print array[val]
       If the array has multiple subscripts, use (i, j) in array.
       The in construct may also be used in a for loop to iterate over all the
       elements of an array.
       An  element  may  be  deleted from an array using the delete statement.
       The delete statement may also be used to delete the entire contents  of
       an array, just by specifying the array name without a subscript.

>Подскажите пожалуйста как правильно инициализировать массивы в awk, как правильно заносить в массив значение и как провести сравнение массивов?

Все это с элементами массивов делается так же, как и с обычными переменными.