Chinaunix首页 | 论坛 | 博客
  • 博客访问: 512287
  • 博文数量: 119
  • 博客积分: 5054
  • 博客等级: 大校
  • 技术积分: 1305
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-03 13:13
文章分类

全部博文(119)

文章存档

2011年(4)

2010年(115)

我的朋友

分类:

2010-01-03 21:17:30

(一). 字串函数

index( 原字串, 找寻的子字串 ):
若原字串中含有欲找寻的子字串,则返回该子字串在原字串中第一次出现的位置,若未曾出现该子字串则返回0.
例如执行 :

$ awk  'BEGIN{ print index("8-12-94","-") }'

结果印出

2

length( 字串 ) : 返回该字串的长度.
例如执行 :  

$ awk  'BEGIN { print length("John") '}

结果印出

4

match( 原字串, 用以找寻比对的正则表达式 ):
awk会在原字串中找寻合乎正则表达式的子字串. 若合乎条件的子字串有多个, 则以原字串中最左方的子字串为准.
awk找到该字串后会依此字串为依据进行下列动作:
设定awk內建变量 RSTART, RLENGTH :

RSTART =  合条件的子字串在原字串中的位置.
       =  0 ; 若未找到合条件的子字串.
RLENGTH = 合条件的子字串长度.
       = -1 ; 若未找到合条件的子字串.

返回 RSTART 之值.
例如执行 :

awk ' BEGIN {
    match( "banana", /(an)+/ )
    print RSTART, RLENGTH
} '       

执行结果输出

2 4

split( 原字串, 数组名称, 分隔字符 ):
awk将依所指定的分隔字符(field separator)来分隔原字串成一个个的栏位(field),并以指定的数组记录各个被分隔的栏位.
例如 :

ArgLst = "5P12p89"
split( ArgLst, Arr, /[Pp]/)

执行后 : Arr[1]=5, Arr[2]=12, Arr[3]=89

sprintf(格式字符串, 项1, 项2, …)
该函数的用法与awk或C的输出函数printf()相同. 所不同的是sprintf()会将要求印出的结果当成一个字串返回. 一般最常使用sprintf()来改变资料格式. 如: x 为一数值资料, 若欲将其变成一个含二位小数的资料,可执行如下指令:

x = 28
x = sprintf("%.2f",x)

执行后 x = “28.00″

sub( 比对用的正则表达式, 将替換的新字串, 原字串 )(sub是substitute的简写,表“置换、替换”意思)
sub( )将原字串中第一个(最左边)合乎所指定的正则表达式的子字串改以新字串取代.
第二个参数”将替換的新字串”中可用”&”来代表”合於条件的子字串”
承上例,执行下列指令:

A = "a6b12anan212.45an6a"
sub( /(an)+[0-9]*/, "[&]", A)
print A

结果输出

ab12[anan212].45an6a

sub()不仅可执行替换(replacement)的功用,当第二个参数为空字串(“”)时,sub()所执行的是”去除指定字串”的功用.
通过 sub() 与 match() 的搭配使用,可逐次取出原字串中合乎指定条件的所有子字串.
例如执行下列程式:

awk '
BEGIN {
data = "p12-P34 P56-p61"
while( match( data ,/[0-9]+/) > 0) {
print substr(data, RSTART, RLENGTH )
sub(/[0-9]+/,"",data) #该语句不能少,如去掉,则程序进入了死循环,也失去了逐次取出原字串中合乎指定条件的所有子字串的功能
}
}'

结果输出 :

12
34
56
61

sub( )中第三个参数(原字串)若未指定,则其预设值为$0.
可用 sub( /[9-0]+/,”digital” ) 表示 sub(/[0-9]+/,”digital”,$0 )

gsub( 比对用的正则表达式, 将替換的新字串, 原字串 )
这个函数与 sub()一样,同样是进行字串取代的函数. 唯一不同点是

  • gsub()会取代所有合条件的子字串.
  • gsub()会返回被取代的子字串个数.

substr( 字串,起始位置 [,长度] ):
返回从起始位置起,指定长度的子字串. 若未指定长度,则返回起始位置到字串末尾的子字串.
执行下例

$ awk 'BEGIN { print substr("User:Wei-Lin Liu", 6)}'

结果印出

Wei-Lin Liu

(二). 数学函数

int(x) : 返回x的整数部分(去掉小数).
例如 :
int(7.8) 将返回 7
int(-7.8) 将返回 -7

sqrt(x) : 返回x的平方根.
例如 :
sqrt(9) 将返回 3
若 x 为负数,则执行 sqrt(x)时将造成 Run Time Error [译者注: 我这里没有发生错误,返回的是"nan"]

exp(x) : 将返回e的x次方.
例如 :
exp(1) 将返回 2.71828

log(x) : 将返回x以e为底的对数值.
例如 :
log(exp(1)) 将返回 1
若 x< 0 ,则执行 sqrt(x)时将造成 Run Time Error. [译者注: 我这里也没有发生错误,返回的是"nan"]

sin(x) : x 须以弧度为单位,sin(x)将返回x的sin函数值.

cos(x) : x 须以弧度为单位,cos(x)将返回x的cos函数值

atan2(y,x) : 返回 y/x 的tan反函数之值,返回值系以弧度为单位.

rand() : 返回介于 0与1之间的(近似)随机数值; 0 < rand()<1.
除非使用者自行指定rand()函数起始的种子,否则每次执行awk程式时, rand()函数都将使用同一个內定的种子,来产生随机数.

srand([x]) : 指定以x为rand( )函数起始的种子.
若省略了x,则awk会以执行时的日期与时间为rand()函数起始的种子.

阅读(667) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~