《AWK程序设计语言》笔记-函数

awk 函数

awk 内建算术函数

函数 返回值
atan2(y,x) y/x的反正切值,定义域在-π到π之间
cos(x) x的余弦值,x以弧度为单位
exp(x) x的指数函数,e^x
int(x) x的整数部分,当x大于0时,向0取整
log(x) x的自然对数(以e为底)
rand() 返回一个随机数r, 0 <= r < 1
sin(x) x的正弦值,x以弧度为单位
sqrt(x) x的平方根
srand(x) x是rand()的随机数种子

awk 内建字符串函数

函数 描述
gsub(r,s) 将$0中所有出现的r替换为s,返回替换发生的次数
gsub(r,s,t) 将字符串t中所有出现的r替换为s,返回替换发生的次数
index(s,t) 返回字符串t在s中第一次出现的位置,如果t没有出现的话,返回0
length(s) 返回s包含的字符个数
match(s,r) 测试s是否包含能被r匹配的子串,返回子串的起始位置或0;设置RSTART和RLENGTH
split(s,a) 用FS将s分割到数组a中,返回字段的个数
split(s,a,fs) 用fs分割s到数组a中, 返回字段的个数
sprintf(fmt,expr-list) 根据格式字符串fmt返回格式化后的expr-list
sub(r,s) 将$0的最左最长的,能被r匹配的子字符串替换为s,返回替换发生的次数
sub(r,s,t) 把t的最左最长的,能被r匹配的子字符串替换为s,返回替换发生的次数
substr(s,p) 返回s中从位置p开始的后缀
substr(s,p,n) 返回s中从位置p开始的,长度为n的子字符串

awk 自定义函数

除了内建函数,awk还支持用户自定义函数,自定义的函数具有如下形式

function name(parameter-list){
    statements
}

函数体可能包含一个return语句,用于将执行流返回至调用函数,返回时可以带有一个值,它的形式为

return expression

expression 和 reture都是可选的, 如果没有为return语句提供表达式,或者最后执行的不是return,那么返回值就是未定义的

几点说明

  • 调用用函数时, 函数名和左括号之间不能留有空白。
  • 函数被调用时,参数除了数组都是“按值传递”的,参数时数组时是“按引用传递”的。
  • 在函数体内部除了参数时局部变量,其余的变量都是全局的。如果函数中一个变量没有出现在参数列表中,那么整个程序范围内都可以访问该变量
示例
[[email protected] awk]$ cat countries 
USSR 8649 275 Asia 
Canada 3852 25 North America 
China 3705 1032 Asia 
USA 3615 237 North America 
Brazil 3286 134 South America 
India 1267 746 Asia
Mexico 762 78 North America 
France 211 55 Europe 
Japan 144 120 Asia 
Germany 96 61 Europe 
England 94 56 Europe
[[email protected] awk]$ awk 'function max(m,n) {t +=1 ; return m > n ? m : n } {print max($2, $3), t, m}' countries 
8649 1 
3852 2 
3705 3 
3615 4 
3286 5 
1267 6 
762 7 
211 8 
144 9 
96 10 
94 11 

可以看到外面是可以访问到函数内的变量t的值的,但是访问不到参数列表中的m。


wechat
微信扫一扫,订阅我的博客动态^_^