]]> ]]>

gawk

Реализация языка программирования AWK

gawk — интерпретатор GNU AWK, написанный на C и распространяемый под лицензией GNU GPL.

Примеры:

CamelCase:

Пример для версий gawk 3.1.6

В переменной $0 хранится вся прочитанная запись-строка (в отличие от переменных $1, $2, …, в которых хранятся поля этой записи). Функция split разбивает строку text на фрагменты, разделенные строками, каждая из которых соответствует регулярному выражению, и записывает их в массив words. После этого каждый элемент words переводится в правильный регистр по частям функциями substr, toupper и tolower.

{   text = $0;
    split(text, words, /[^a-zA-Z]+/);
    for (i=1; i<=length(words); i++) {
        res = res toupper(substr(words[i],1,1)) tolower(substr(words[i],2));
    }
    print res
}

Hello, World!:

Пример для версий Jawk 1.02, gawk 3.1.6, mawk 1.3.3

Печать выполняется шаблоном BEGIN, т.е. перед обработкой входных данных. Сами данные не обрабатываются.

BEGIN { print "Hello, World!" }

Факториал:

Пример для версий Jawk 1.02, gawk 3.1.6, mawk 1.3.3

Используется итеративное определение факториала. Отдельные команды в пределах блока могут разделятся точками с запятой или переносами строк.

BEGIN {
    f = 1
    print "0! = " f
    for (i=1; i<17; i++) {
        f *= i
        print i "! = " f
    }
}

Числа Фибоначчи:

Пример для версий Jawk 1.02, gawk 3.1.6, mawk 1.3.3

Используется итеративное определение чисел Фибоначчи. fib — ассоциативный массив, pr — строка.

BEGIN {
    fib[1] = 1
    fib[2] = 1
    for (i=3; i<17; i++)
        fib[i] = fib[i-1]+fib[i-2]
    pr = ""
    for (i=1; i<17; i++)
        pr = pr fib[i] ", "
    print pr "..." 
}

Квадратное уравнение:

Пример для версий Jawk 1.02, gawk 3.1.6, mawk 1.3.3
{   A = $1
    B = $2
    C = $3
    if (A == 0) 
        print "Not a quadratic equation"
    else
    {   D = B*B-4*A*C
        if (D == 0)
            print "x = " (-B/2/A)
        else if (D > 0)
        {   print "x1 = " ((-B+sqrt(D))/2/A)
            print "x2 = " ((-B-sqrt(D))/2/A)
        }
        else
        {   print "x1 = (" (-B/2/A) "," (sqrt(-D)/2/A) ")"
            print "x2 = (" (-B/2/A) "," (-sqrt(-D)/2/A) ")"
        }
    }
}

CamelCase:

Пример для версий Jawk 1.02, gawk 3.1.6, mawk 1.3.3

В реализации mawk нет функции length для определения количества элементов массива. В реализации Jawk ее также нельзя использовать — возникает ошибка “Cannot evaluate an unindexed array.”.

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

{   text = $0;
    N = split(text, words, /[^a-zA-Z]+/);
    for (i=1; i<=N; i++) {
        res = res toupper(substr(words[i],1,1)) tolower(substr(words[i],2));
    }
    print res
}

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам