gawk中使用内建函数
gawk中有一些内建函数用于处理比较通用的运算,比如数学运算和字符串处理。
1 gawk中使用数学运算的内建函数
常用的数学运算函数有sin
,cos
,sqrt
,int
等等,int
是用于取整运算,输入:
gawk 'BEGIN {y=int(3.14);z=int(-3.14);print y,z}'
运行后结果为:
3 -3
2 gawk中使用字符串处理的函数
个人感觉这一节非常重要,之后可以用到的地方非常多。
2.1 toupper,tolower,length的使用
比如文本data8的内容为:
WuLinWaiZhuan,ZhaoBenShan
输入:
gawk 'BEGIN{FS=","}{x=$1;y=toupper(x);z=tolower(x);printf("%s, %s, %s, %d\n"),x,y,z,length(z)}' data8
运行后结果为:
WuLinWaiZhuan, WULINWAIZHUAN, wulinwaizhuan, 13
toupper
和tolower
函数将字符串分别转化成大写和小写,length
返回字符串的长度。
2.2 split函数分割字符串
split
是按照指定的分割字符去分割字符串,返回值是分割后的字符串的个数,输入:
echo "12:34:56:78"|gawk '{split($0,a,":");for(i=1;i<=4;i++){print a[i]}}'
运行后结果为:
12
34
56
78
当在shell脚本中去对字符串引用时候,要使用"
和"
组成的双引号。建立一个shell脚本,输入:
#/bin/bash
str=12:34:56:78
awk 'BEGIN {num=split('"\"$str\""', array, ":");for (i=1;i<=num;i++){print array[i]}}'
运行这个脚本后,结果为:
12
34
56
78
2.3 gawk中使用index函数
index(s,t)
是查找字符串t
在s
字符串索引值,如果找不到返回0
,index
返回子字符串第一次被匹配的位置,偏移量从位置1开始.输入:
awk 'BEGIN { a="mytest";b="test";print index(a, b) }'
运行后结果为:
3
再输入:
awk 'BEGIN { a="mytest";b="ttt";print index(a, b) }'
运行后结果为:
0
2.4 gawk中使用sub和gsub函数
sub
和gsub
都是用于字符串替换,sub
只会替换一行中第一次的成功匹配,gsub
会替换所有的成功匹配,比如文件data8的内容为:
LinWaiZhuan,ZhaoBenShanLin
输入:
gawk 'BEGIN{FS=","}{sub("Lin","Test");print $0}' data8
运行后结果为:
TestWaiZhuan,ZhaoBenShanLin
sub函数只修改了第一个Lin为Test。
再输入:
gawk 'BEGIN{FS=","}{gsub("Lin","Test");print $0}' data8
运行后结果为:
TestWaiZhuan,ZhaoBenShanTest
gsub
把所有的Lin
都改成Test
注意:sub
和gsub
可以使用正则表达式,比如输入:
gawk 'BEGIN{FS=","}{gsub("^Lin","Test");print $0}' data8
运行后结果为:
TestWaiZhuan,ZhaoBenShanLin
这里用逗号把一行数据分割之后,修改以Lin开头的字段。
2.5 substr函数截取字符串
substr(str, start,len)
从字符串str
的start
索引位置截取len
长度的字符串,如果么有指定len
这个参数的话,那就截取到结尾。
输入:
awk 'BEGIN { print substr( "hello world", 7,11 ) }'
运行后结果为:
world
再输入:
awk 'BEGIN { print substr( "hello world", 4 ) }'
运行后结果为:
lo world
2.6 match函数正则表达式匹配
match
返回在字符串中正则表达式位置的索引,如果找不到指定的正则表达式则返回0
。match
函数会设置内建变量RSTART
为字符串中子字符串的开始位置,RLENGTH
为到子字符串末尾的字符个数。substr
可利于这些变量来截取字符串
输入:
awk 'BEGIN{start=match("this is a test",/[a-z]+$/); print start}'
运行后结果为:
11
再输入:
awk 'BEGIN{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'
运行后结果为:
11 11 4