awk用户自定义函数

脚本中凡是可以出现模式操作规则的位置都可以放置用户自定义的函数。

格式

函数名(参数,参数,参数, ...){

语句

return 表达式

(注: return语句和表达式都是可选项)

}

变量以参数值的方式传递,且仅在使用它的函数中局部有效。函数使用的只是变量的副本。数组则通过地址或引用被传递,因此,可以在函数中直接修改数组的元素。函数中的任何变量,只要不是从参数列表中传来的,就都被视为全局变量,也就是说,该变量对整个awk程序都是可见的,而且,如果它在函数中发生了改变,即在整个程序中发生了改变。在函数中提供局部变量的唯一途径就是将它加入参数列表中。这类参数通常放在参数列表的末端。当调用函数时,如果没有指定某个形参的值,该参数就会被初始化为空。return语句会把控制权交还给调用者,可能还会返回一个值。

范例

$ cat grades

44 55 66 22 77 99

100 22 77 99 33 66

55 66 100 99 88 45

$ cat sorter.sc

# Scriptname: sorter

# It sorts numbers in ascending order

function sort (scores , num_elements , tmp , i , j) {

# temp, i , and j will be local and private,

# with an initial value of null.

for( i = 2;
i <= num_elements ; ++i ) {

for ( j = i;
scores [j-1] > scores[j]; --j ) {

temp = scores[j]

scores[j] = scores[j-1]

scores[j-1] = temp

}

}

}

{for ( i = 1;
i <= NF; i++){

grades[i]=$i

}

sort(grades, NF) #Two
arguments are psssed

for ( j = 1;
j <= NF; ++j )

printf("%d", grades[j])

printf ("\n")

}

$ awk -f sorter.sc grades

22 44 55 66 77 99

22 33 66 77 99 100

45 55 66 88 99 100

说明

1.定义名为sort的函数,函数定义可以出现在脚本的任意位置,除了那些作为参数传递的变量外,所有其他变量的域都是全局的。即如果在函数中发生了变化,也就在整个awk脚本中发生了变化。数组是通过引用进行传递的。圆括号中共有5个形参,其中数组scores将通过引用被传递,所以,如果在函数中修改了这个数组中任何一个元素,原来的数组也会被修改.变量num_elements是一个局部变量,是原变量的一个副本。变量temp、i和j则是函数的局部变量。

2.外层的for循环将遍历一个整数数组,前提是该数组中至少有两个整数可用于比较。

3.内层的for循环用当前这个整数与数组中前一个整数(scores[j-1])进行比较。如果前一个整数大于当前这个整数,就把当前这个数组元素的值赋给变量temp。然后把前一个元素的值赋给当前元素。

4.外层循环至此结束.

5.函数定义的末尾.

6.脚本的第一个操作块由此开始。for循环遍历当前记录的所有字段,生成一个整数数组。

7.调用sort函数,把由当前记录生成的整数数组和当前记录的字段数作为参数传给它。

8.sort函数结束后,程序控制由此开始。这个for循环用于打印完成排序的数组中的元素。

参考资料:http://www.linuxawk.com/jiaocheng/321.html

时间: 2024-12-13 14:33:39

awk用户自定义函数的相关文章

SQL之用户自定义函数

关于SQL Server用户自定义的函数,有标量函数.表值函数(内联表值函数.多语句表值函数)两种. 题外话,可能有部分朋友不知道SQL Serve用户自定义的函数应该是写在哪里,这里简单提示一下,在Microsoft SQL Server Managerment Studio里面,展开具体需要创建SQL Server用户自定义函数的数据库(即每个用户自定义函数只针对具体的一个数据库有用),然后找到可编程性选项,再展开找到函数选项,在具体的函数选项里面可参照下图的方式鼠标右键选择来添加. 标量函

SQL Server用户自定义函数

用户自定义函数不能用于执行一系列改变数据库状态的操作,但它可以像系统 函数一样在查询或存储过程等的程序段中使用,也可以像存储过程一样通过EXECUTE 命令来执行.在 SQL Server 中根据函数返回值形式的不同将用户自 定义函数分为三种类型:(1) 标量函数标量函数返回一个确定类型的标量值,其返回值类型为除 TEXT . NTEXT .IMAGE . CURSOR . TIMESTAMP 和 TABLE 类型外的其它数据类型.函数体语句定义在 BEGIN-END 语句内.在 RETURNS

T-SQL编程 —— 用户自定义函数(内嵌表值函数)

内嵌表值函数 接上 <T-SQL编程 -- 用户自定义函数(标量函数)> http://www.cnblogs.com/viusuangio/p/6212072.html 内嵌表值函数可以用于实现参数化视图(查询),例如有一个查询其定义语句如下: 1 use Student 2 GO 3 --查询笔试成绩几个的同学 4 select s.stuno ,s.stuname,s.brithday,e.written,e.lab 5 from StuInfo s left outer join ex

用户自定义函数

用户自定义函数不能用于执行一系列改变数据库状态的操作,但它可以像系统函数一样在查询或存储过程等的程序段中使用,也可以像存储过程一样通过 EXECUTE 命令来执行. 在 SQL Server 中根据函数返回值形式的不同将用户自定义函数分为三种类型: (1)标量函数 (2)内联表值函数 (3)多语句表值函数 注意:与编程语言中的函数不同的是,SQL Server 自定义函数必须具有返回值. 标量函数 标量函数返回一个确定类型的标量值,其返回值类型为除TEXT.NTEXT.IMAGE.CURSOR.

Pig用户自定义函数(UDF)

我们以气温统计和词频统计为例,讲解以下三种用户自定义函数. 用户自定义函数 什么时候需要用户自定义函数呢?和其它语言一样,当你希望简化程序结构或者需要重用程序代码时,函数就是你不二选择. Pig的用户自定义函数可以用Java编写,但是也可以用Python或Javascript编写.我们接下来以Java为例. 自定义过滤函数 我们仍然以先前的代码为例: records = load 'hdfs://localhost:9000/input/temperature1.txt'as (year: ch

详解Spark sql用户自定义函数:UDF与UDAF

UDAF = USER DEFINED AGGREGATION FUNCTION Spark sql提供了丰富的内置函数供猿友们使用,辣为何还要用户自定义函数呢?实际的业务场景可能很复杂,内置函数hold不住,所以Spark sql提供了可扩展的内置函数接口:哥们,你的业务太变态了,我满足不了你,自己按照我的规范去定义一个sql函数,该怎么折腾就怎么折腾! 例如,MySQL数据库中有一张task表,共两个字段taskid (任务ID)与taskParam(JSON格式的任务请求参数).简单起见,

T-SQL编程 —— 用户自定义函数(标量函数)

用户自定义函数 在使用SQL server的时候,除了其内置的函数之外,还允许用户根据需要自己定义函数.根据用户定义函数返回值的类型,可以将用户定义的函数分为三个类别: 返回值为可更新表的函数 如果用户定义函数包含了单个select语句且语句可更新,则该函数返回的表也可更新,这样的函数称为内嵌表值函数. 返回值不可更新表的函数 如果用户定义函数包含多个select语句,则该函数返回的表不可更新.这样的函数称为多语句表值函数. 返回标量值的函数 用户定义函数返回值为标量值,这样的函数称为标量函数.

SQL Server UDF用户自定义函数

UDF的定义 和存储过程很相似,用户自定义函数也是一组有序的T-SQL语句,UDF被预先优化和编译并且尅作为一个单元爱进行调用.UDF和存储过程的主要区别在于返回结果的方式. 使用UDF时可传入参数,但不可传出参数.输出参数的概念被更为健壮的返回值取代了.和系统函数一样,可以返回标量值,这个值的好处是它并不像在存储过程中那样只限于整形数据类型,而是可以返回大多数SQL Server数据类型. UDF有以下两种类型: 返回标量值的UDF. 返回表的UDF. 创建语法: CREATE FUNCTIO

Pig用户自定义函数(UDF)转

原文地址:http://blog.csdn.net/zythy/article/details/18326693 我们以气温统计和词频统计为例,讲解以下三种用户自定义函数. 用户自定义函数 什么时候需要用户自定义函数呢?和其它语言一样,当你希望简化程序结构或者需要重用程序代码时,函数就是你不二选择. Pig的用户自定义函数可以用Java编写,但是也可以用Python或Javascript编写.我们接下来以Java为例. 自定义过滤函数 我们仍然以先前的代码为例: records = load '