awk

User Defined Functions

awk允许你定义用户定义的函数。这是非常有用的,当你写了很多AWK代码,并最终高达每次重复某些部分的代码。这些片段可以是配合到用户定义函数。

语法:

function fn-name(parameters)
{
 function-body
}

在上面的语法里:

1. fn-name是函数名:像一个awk变量,一个awk的用户定义的函数名应该以字母开头。字符的其余部分可以是数字或字母,或下划线。关键字不能用作功能名称。

2. parameters:多个参数之间用逗号分隔。您也可以创建一个用户定义的函数不带任何参数。

3. function-body: 一条或多条awk语句。

如果你已经使用过的名称作为AWK程序中的变量,则不能使用相同的名称作为您的用户自定义函数。

下面的示例创建一个简单的用户定义函数叫discount,给一个指定价格折扣百分比。例如,折扣( 10 )给出的价格10 %的折扣。

对于其中任何物品的数量<= 10 ,它提供了10 %的折扣,否则给50 %的折扣。

$ cat function.awk
BEGIN {
    FS=","
    OFS=","
}
{
    if ( $5 <= 10)
        print $1,$2,$3,discount(10),$5
    else
        print $1,$2,$3,discount(50),$5
}

function discount(percentage)
{
    return $4 -($4*percentage/100)
}


$ cat items.txt
101,HD Camcorder,Video,210,10
102,Refrigerator,Appliance,850,2
103,MP3 Player,Audio,270,15
104,Tennis Racket,Sports,190,20
105,Laser Printer,Office,475,5

$ awk -f function.awk items.txt
101,HD Camcorder,Video,189,10
102,Refrigerator,Appliance,765,2
103,MP3 Player,Audio,135,15
104,Tennis Racket,Sports,95,20
105,Laser Printer,Office,427.5,5

另一个很好的利用创建一个自定义的功能是打印调试消息。

Following is a simple mydebug function:
$ cat function-debug.awk
{
    i=2; total=0;
    while (i <= NF){
        mydebug("quantity is " $i);
        total=total + $i;
        i++;
    }
    print "Item",$1, ":", total, "quantities sold";
}

function mydubeg (message) {
    printf("DEBUG[%d]>%s\n", NR, message)
}
[luckyzhou@www ~]$ cat items-sold.txt
101 2 10 5 8 10 12
102 0 1 4 3 0 2
103 10 6 11 20 5 13
104 2 3 4 0 6 5
105 10 2 5 7 12 6
[luckyzhou@www ~]$ awk -f function-debug.awk items-sold.txt
awk: function-debug.awk:4: (FILENAME=items-sold.txt FNR=1) fatal: function `mydebug' not defined
[luckyzhou@www ~]$ vi +4 function-debug.awk
[luckyzhou@www ~]$ awk -f function-debug.awk items-sold.txt
DEBUG[1]>quantity is 2
DEBUG[1]>quantity is 10
DEBUG[1]>quantity is 5
DEBUG[1]>quantity is 8
DEBUG[1]>quantity is 10
DEBUG[1]>quantity is 12
Item 101 : 47 quantities sold
DEBUG[2]>quantity is 0
DEBUG[2]>quantity is 1
DEBUG[2]>quantity is 4
DEBUG[2]>quantity is 3
DEBUG[2]>quantity is 0
DEBUG[2]>quantity is 2
Item 102 : 10 quantities sold
......