|
3#
楼主 |
发表于 2007-12-22 21:00:28
|
只看该作者
接上....
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 }} '
10.其他
1) 为了避免碰到awk错误,可以总结出以下规律:
① 确保整个awk_script用单引号括起来。
② 确保awk_script内所有引号成对出现。
③ 确保用花括号括起动作语句,用圆括号括起条件语句。
④ 可能忘记使用花括号,也许你认为没有必要,但awk不这样认为,将按之解释语法。
⑤ 如果使用字符串,一定要保证字符串被双引号括起来(在模式中除外)。
2) 在awk中,设置有意义的域名是一种好习惯,在进行模式匹配或关系操作时更容易理解。一般的变量名设置方式为name=$n。(这里name为调用的域变量名, n为实际域号。)
3) 通常在BEGIN部分给一些变量赋值是很有益的,这样可以在awk表达式进行改动时减少很多麻烦。
4) awk的基本功能是根据指定规则抽取输入数据的部分内容并输出,另一个重要的功能是对输入数据进行分析运算得到新的数据并输出,这是通过在awk_script中对字段变量($1、$2、$3...)从新赋值或使用更大的字段变量$n(n大于当前记录的NF)而实现的。
5) 使用字符串或正则表达式时,有时需要在输出中加入一新行或查询一元字符。这时就需要字符串屏蔽序列。awk中经常使用的屏蔽序列有:
b 退格键 t tab键 f 走纸换页 ddd 八进制值 n 新行 r 回车键
c 任意其他特殊字符。eg: 为反斜线符号
6) awk的输出函数printf,基本上和C语言的语法类似。
① 格式: printf ("输出模板字符串",参数列表)
② 参数列表是以逗号分隔的列表,参数可以是变量、数字值或字符串。
③ 输出模板字符串的字符串中必须包含格式控制符,有几个参数就要求有几个格式控制符。模板字符串中可以只有格式控制符而没有其它字符。
④ 格式控制符: %[-][width][.prec]fmt
% : 标识一个格式控制符的开始,不可省略。
- : 表示参数输出时左对齐,可省略。
width : 一个数字,表示参数输出时占用域的宽度,可省略。
.prec : prec是一个数值,表示最大字符串长度或小数点右边的位数,可省略。
fmt : 一个小写字母,表示输出参数的数据类型,不可省略。
⑤ 常见的fmt : c ASCII字符
d 整数
e 浮点数,科学记数法
f 浮点数,如 123.44
g 由awk决定使用哪种浮点数转换e或f
o 八进制数
s 字符串
x 十六进制数
⑥ 举例: echo "65" | awk '{ printf ("%cn",$0) }' // 将打印 A
awk 'BEGIN{printf "%.4fn",999}' //将打印 999.0000
awk 'BEGIN{printf "2 number:%8.4f%8.2f",999,888}' // 将打印 2 number:999.0000 888.000 |
|