《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还支持用户自定义函数,自定义的函数具有如下形式

1
2
3
function name(parameter-list){
statements
}

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

1
return expression

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

几点说明

  • 调用用函数时, 函数名和左括号之间不能留有空白。
  • 函数被调用时,参数除了数组都是“按值传递”的,参数时数组时是“按引用传递”的。
  • 在函数体内部除了参数时局部变量,其余的变量都是全局的。如果函数中一个变量没有出现在参数列表中,那么整个程序范围内都可以访问该变量
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    示例
    [[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。

您的支持将鼓励我继续创作!