一、split 初始化和類型強制
awk的內建函數split允許你把一個字符串分隔為單詞並存儲在數組中。你可以自己定義域分隔符或者使用現在FS(域分隔符)的值。
格式:
split (string, array, field separator)
split (string, array) -->如果第三個參數沒有提供,awk就默認使用當前FS值。
例子:
例1:替換分隔符
1
2
3
time="12:34:56"
out=echo $time | awk '{split($0,a,":");print a[1],a[2],a[3]}'
echo $out
例2:計算指定范圍內的和(計算每個人1月份的工資之和)
1
2
3
4
5
6
7
8
9
10
[root@test ~]# cat test.txt
Tom 2012-12-11 car 53000
John 2013-01-13 bike 41000
vivi 2013-01-18 car 42800
Tom 2013-01-20 car 32500
John 2013-01-28 bike 63500
[root@test ~]# awk '{split($2,a,"-");if(a[2]==01){b[$1]+=$4}}END{for(i in b)print i,b[i]}' test.txt
vivi 2800
Tom2500
John4500
二、substr 截取字符串
返回從起始位置起,指定長度之子字符串;若未指定長度,則返回從起始位置到字符串末尾的子字符串。
格式:
substr(s,p) 返回字符串s中從p開始的后綴部分
substr(s,p,n) 返回字符串s中從p開始長度為n的后綴部分
例子:
1
2
[root@test ~]# echo "123" | awk '{print substr($0,1,1)}'
1
解釋:
awk -F ',' '{print substr($3,6)}' ---> 表示是從第3個字段里的第6個字符開始,一直到設定的分隔符","結束.
substr($3,10,8) ---> 表示是從第3個字段里的第10個字符開始,截取8個字符結束.
substr($3,6) ---> 表示是從第3個字段里的第6個字符開始,一直到結尾
三、length 字符串長度
length函數返回沒有參數的字符串的長度。length函數返回整個記錄中的字符數。
1
2
[root@test ~]# echo "123" | awk '{print length}'
3
awk的字符串函數substr
substr(s,p) 返回字符串s中從p開始的后綴部分
substr(s,p,n) 返回字符串s中從p開始長度為n的后綴部分
實例操作
$ awk ‘$1”L.Transley” {print substr($1, 1,5)}’ grade.txt
L.Tan
上面例子中,指定在域1的第一個字符開始,返回其前面5個字符。
如果給定長度值遠大於字符串長度, awk將從起始位置返回所有字符,要抽取L.Tansley的姓,只需從第3個字符開始返回長度為7。可以輸入長度99,awk返回結果相同。
$ awk ‘{$1”L.Transley” {print substr($1, 3,99)}’ grade.txt
Transley
substr的另一種形式是返回字符串后綴或指定位置后面字符。這里需要給出指定字符串及其返回字串的起始位置。例如,從文本文件中抽取姓氏,需操作域1,並從第三個字符開始:
$ awk ‘{print substr($1, 3)}’ grade.txt
Troll
Transley
還有一個例子,在BEGIN部分定義字符串,在END部分返回從第t個字符開始抽取的子串。
$ awk ‘{BEGIN STR=”A FEW GOOD MEN”} END {print substr(STR,7)) grade.txt
GOOD MEN