(轉)awk實例練習(二)

文章轉自 http://www.cnblogs.com/zhuyp1015/archive/2012/07/14/2591842.htmlhtml

先來總結一下awk內置變量:正則表達式

ARGC          命令行參數個數
ARGV          命令行參數排列
ENVIRON       支持隊列中系統環境變量的使用
FILENAME      awk瀏覽文件名
FNR           瀏覽文件的記錄數
FS            設置輸入域分隔符,等價於命令行-F選項
NF            瀏覽記錄的域個數
NR            已讀的記錄數
OFS           輸出域分隔符
ORS           輸出例句分隔符
RS            控制記錄分隔符
 
 
$ awk '{print NF,NR,$0} END {print FILENAME}' grade.txt
7 1 M.Tansley   05/99   48311   Green   8       40      44
7 2 J.Lulu      06/99   48317   green   9       24      26
7 3 P.Bunny     02/99   48      Yellow  12      35      28
7 4 J.Troll     07/99   4842    Brown-3 12      26      26
7 5 L.Tansley   05/99   4712    Brown-2 12      30      28
grade.txt
 
#使用 -F 參數指定分隔符
$ echo $PWD
/home/zhuyupeng
 
$ echo $PWD | awk -F/ '{print $NF"\t"NF}'
zhuyupeng       3
 
#設置變量名,將27 賦值給變量BASELINE
$ awk 'BEGIN {BASELINE="27"} $6<BASELINE {print $0}' grade.txt
J.Lulu  06/99   48317   green   9       24      26
J.Troll 07/99   4842    Brown-3 12      26      26
 
#修改數值域取值,注意‘{}’
$ awk '{if($1=="M.Tansley") $6=$6-1; print $1,$6,$7}' grade.txt
M.Tansley 39 44
J.Lulu 24 26
P.Bunny 35 28
J.Troll 26 26
L.Tansley 30 28
 
#修改文本域取值
$ awk '{if($1=="J.Troll") $1="J.L.Troll"; print $1}' grade.txt
M.Tansley
J.Lulu
P.Bunny
J.L.Troll
L.Tansley
 
#建立新的輸出域,這裏新的輸出域爲 diff
$ awk 'BEGIN {print "Name \t Difference"} {if($6<$7) {diff=$7-$6; print $1,diff}}' grade.txt
Name     Difference
M.Tansley 4
J.Lulu 2
 
#統計某一個域的和,使用‘+=’ 下面的例子統計第六個域的和
$ awk '(tot+=$6); END{print "Club student total points: " tot}' grade.txt
M.Tansley       05/99   48311   Green   8       40      44
J.Lulu  06/99   48317   green   9       24      26
P.Bunny 02/99   48      Yellow  12      35      28
J.Troll 07/99   4842    Brown-3 12      26      26
L.Tansley       05/99   4712    Brown-2 12      30      28
Club student total points: 155
 
#注意區別,加‘{}’則不打印文件
$ awk '{(tot+=$6)}; END{print "Club student total points: " tot}' grade.txt
Club student total points: 155
 
 
awk 內置字符串函數
 
gsub(r,s)          在整個$0中用s替代r
gsub(r,s,t)        在整個t中使用s替代r
index(s,t)         在返回s中字符串t的第一個位置
length(s)          放回s長度
match(s,r)         測試s是否包含匹配r的字符串
split(s,a,fs)      在fs上將s分紅序列a
sprint(fmt,exp)    返回經fmt格式化後的exp
sub(r,s)           用$0中最左邊最長的子串代替s
substr(s,p)        返回字符串s中從p開始的後綴部分
substr(s,p,n)      返回字符串s中從p開始長度爲n的後綴部分
 
#替換,目標串使用正則表達式格式‘//’
$ awk 'gsub(/4842/,4899) {print $0}' grade.txt
J.Troll 07/99   4899    Brown-3 12      26      26
 
#查詢字符串第一次出現的位置,注意使用BEGIN,不然每一行都會打印,字符串使用引號括起來
$ awk 'BEGIN{print index("Bunny","ny")}' grade.txt
4
 
#長度
$ awk '$1=="J.Troll" {print length($1)" "$1}' grade.txt
7 J.Troll
 
#match 使用: 找不到返回0,找到返模式串在匹配串中的位置
#注:單獨使用 加BEGIN
$ awk 'BEGIN {print match("ANCD",/d/)}'
0
 
#如下兩種模式都正確
$ awk '$1=="J.Lulu" {print match($1,"u")}' grade.txt
4
 
$ awk '$1=="J.Lulu" {print match($1,/u/)}' grade.txt
4
 
#split 返回字符串數組元素個數
$ awk 'BEGIN {print split("123#456#789",myarray,"#");print myarray[1],myarray[2],myarray[3]}'
3
123 456 789
 
#sub,發現並替換模式的第一個位置
$ awk '$1=="J.Troll" {sub(26,29,$0)} {print $0}' grade.txt
M.Tansley       05/99   48311   Green   8       40      44
J.Lulu  06/99   48317   green   9       24      26
P.Bunny 02/99   48      Yellow  12      35      28
J.Troll 07/99   4842    Brown-3 12      29      26
L.Tansley       05/99   4712    Brown-2 12      30      28
 
#substr,返回字符串指定範圍內的子串
$ awk '$1=="L.Tansley" {print substr($1,1,5)}' grade.txt
L.Tan
 
#使用substr返回指定位置開始的後綴部分,範圍只給了一個參數,注意和上一個例子相對比
$ awk '{print substr($1,3)}' grade.txt
Tansley
Lulu
Bunny
Troll
Tansley
 
#從shell中向awk傳遞字符串,經過 echo 加管道的方式
$ echo "Test" | awk '{print length($0)}'
4
$ STR="mydoc.txt"
$ echo $STR | awk '{print substr($STR,7)}'
txt
相關文章
相關標籤/搜索