linux下awk內置函數的使用(split/substr/length)


一、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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM