|

楼主 |
发表于 2010-4-22 14:46
|
显示全部楼层
7.awk的内置函数
可以在awk_script的任何地方使用awk函数。和awk变量一样,awk函数可以分为内置函数和自定义函数。
1) 常见awk内置数值函数 int(x) : 求出x 的整数部份,朝向0 的方向做舍去。eg: int(3.9)是3,int(-3.9) 是-3。 sqrt(x) : 求出x 正的平方根值。eg: sqrt(4)=2 exp(x) : 求出x 的次方。eg: exp(2) 即是求e*e 。 log(x) : 求出x 的自然对数。 sin(x) : 求出x 的sine 值,x 是弪度量。 cos(x) : 求出x 的cosine 值,x 是弪度量。 atan2(y,x) : 求y/x 的arctangent 值,所求出的值其单位是弪度量。 rand() : 得到一个随机数(平均分布在0和1之间)。每次执行gawk,rand从相同的seed生成值。 srand(x) : 设定产生随机数的seed为x。如果在第二次运行awk程序时你设定相同的seed值,你将再度得到相同序列的随机数。如果省略引数x,例如srand (),则当前日期时间会被当成seed。这个方法可使得随机数值是真正不可预测的。 srand() : 其值是当次awk_script运行过程中前次srand(x)的设定的seed值x,。
2) 常见awk内置字符串函数 index(in, find) : 返回字符串in中字符串find第一次出现的位置(索引从1开始),如果在字串in中找不到字符串find,则返回值为0。eg: print index("peanut","an") 会印出3。 length(s) : 求出字符串s的字符个数。eg: length("abcde") 是5。 match(s,r) : 返回模式字符串r在字符串s的第一次出现的位置,如果s不包含r,则返回值0。 sprintf(fmt,exp1,...) : 和printf类似印出,是sprintf不是打印而是返回经fmt格式化后的exp。 eg: sprintf("pi = %.2f (approx.)",22/7) 传回的字串为"pi = 3.14 (approx.)" sub(p, r,t) : 在字符串t中寻找符合模式字符串p的最靠前最长的位置,并以字符串r代替最前的p。 eg: str = "water, water"sub(/at/, "ith",str) 结果字符串str 会变成"wither, water" gsub(p, r, t) : gsub与sub类似。不过时在字符串t中以字符串r 代替所有的p。 eg: str="water, water" ; gsub(/at/, "ith",str) 结果字符串str会变成"wither,wither" substr(str, st, len) : 传回str的子字符串,其长度为len字符,从str的第st个位置开始。如果len没有出现,则传回的子字符串是从第st个位置开始至结束。 eg: substr("washington",5,3) 传回值为"ing" substr("washington",5) 传回值为"ington" split(s,a,fs) : 在分隔符fs为分隔符将字符串s分隔成一个awk数组a,并返回a的下标数。 eg: awk 'BEGIN{print split("123#456#789",myarray,"#")}' 将打印 3 。 tolower(str) : 将字符串str的大写字母改为小写字母。 eg: tolower("MiXeD cAsE 123") 传回值为"mixed case 123" toupper(str) : 将字符串string 的小写字母改为大写字母。 eg: toupper("MiXeD cAsE 123")传回值为"MIXED CASE 123" 3) 常见awk内置系统函数 close(filename) : 将输入或输出的文件filename 关闭。 system(command) : 此函数允许调用操作系统的指令,执行完毕后将回到awk程序。 eg: awk 'BEGIN {system("ls")}'
8. 自定义函数
复杂的awk常常可以使用自己定义的函数来简化。调用自定义的函数与调用内置函数的方法一样。
1) 自定义函数定义的格式: 自定义函数可以在awk程序的任何地方定义。 function fun_name (parameter_list) { // parameter_list是以逗号分隔的参数列表 body-of-function // 函数体,是awk语句块 }
2) 举例: awk '{ print "sum =",SquareSum($1,$2) } function SquareSum(x,y) { sum=x*x+y*y ; return sum } ' grade.txt 9.awk的数组数组使用前,不必预先定义,也不必指定数组元素个数。 1) 访问数组的元素。经常使用循环来访问数组元素,下面是一种循环类型的基本结构: for (element in array_name ) print array_name[element] 2) 举例: awk 'BEGIN{print split("123#456#789",mya,"#") ; for (i in mya) { print mya }} ' |
|