本篇记录awk中内置字符串函数及其使用实例
1. 【gsub】
这个函数类似于sed,用于替换字符串
用法用两种:
gsub(r,s) 在整个$0中用s替代r
gsbu(r,s,t) 在整个t中用s替代r
第1中用法作用于所有域,第2中用法作用于指定的域
本例实验前,将J.Troll的$5也改为12。
awk 'gsub(/12/,13)' grade.txt
P.Bunny 02/99 48 Yellow 13 35 28
J.Troll 07/99 4842 Brown-3 13 13 26
L.Tansley 05/99 4713 Brown-2 13 30 28
可以看到,$4和$5的12都被改成了13
awk 'gsub(/12/,13,$5)' grade.txt
P.Bunny 02/99 48 Yellow 13 35 28
J.Troll 07/99 4842 Brown-3 13 12 26
L.Tansley 05/99 4712 Brown-2 13 30 28
可以看到只有$5的12被改了
2. 【index】
函数原型:index (s,t) 返回s中字符串t的第一位置
awk 'BEGIN {print index("Bunny","ny")}' grade.txt
4
字符串必须要用双引号括起来
3. 【length】
函数原型:length(s) ,求字符串的长度
awk '$1=="J.Troll" {print length($1)}' grade.txt
7
计算字符串长度
4. 【match】
函数原型:match(s,r) 测试 s 是否包含匹配 r 的字符串
awk 'BEGIN {print match("ANCD",/D/)}' grade.txt
4
查找目标字符串在源字符串中的位置,目标字符串可以是正则表达式的形式
5. 【split】
函数原型:split(s,a,fs)
在f s上将s分成序列a,返回数组元素个数,
例如一个字符串为137-1234-2345-987,以 - 为分隔符分成4个元素
awk 'BEGIN {print split("137-1234-2345-987",myarray,"-")}'
4
5 【sub】
函数原型: sub(r,s) 用$0左边最长的字串代替s
awk '{if($1=="J.Troll") {sub(/26/,"29") ;print $0}}' grade.txt | tee grade.txt
J.Troll 07/99 4842 Brown-3 12 29 26
可以看出,在匹配出J.Troll的记录后,只有第一个26被改为了29,第二个没有改。
6. 【substr】
substr有两种用法:
substr(s,p) 返回字符串s中从p位置开始的后缀部分
substr(s,p,n) 返回字符串s中从p位置开始的n个字符
awk '{if($1=="L.Tansley") {print substr($1,3,3)}}' grade.txt
Tan
awk '{if($1=="L.Tansley") {print substr($1,3)}}' grade.txt
Tansley