awk 實例練習(二)


上一篇,這里使用的grade.txt 也是和上一篇中的相同。

先來總結一下awk內置變量:

ARGC          命令行參數個數
ARGV          命令行參數排列
ENVIRON       支持隊列中系統環境變量的使用
FILENAME      awk瀏覽文件名
FNR           瀏覽文件的記錄數
FS            設置輸入域分隔符,等價於命令行-F選項
NF            瀏覽記錄的域個數
NR            已讀的記錄數
OFS           輸出域分隔符
ORS           輸出例句分隔符
RS            控制記錄分隔符
 
 
zhuyupeng@zhuyupeng-PC ~
$ 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 參數指定分隔符
zhuyupeng@zhuyupeng-PC ~
$ echo $PWD
/home/zhuyupeng
 
zhuyupeng@zhuyupeng-PC ~
$ echo $PWD | awk -F/ '{print $NF"\t"NF}'
zhuyupeng       3

#設置變量名,將27 賦值給變量BASELINE
zhuyupeng@zhuyupeng-PC ~
$ 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

#修改數值域取值,注意‘{}’
zhuyupeng@zhuyupeng-PC ~
$ 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
 
#修改文本域取值
zhuyupeng@zhuyupeng-PC ~
$ 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
zhuyupeng@zhuyupeng-PC ~
$ 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
 
#統計某一個域的和,使用‘+=’ 下面的例子統計第六個域的和
zhuyupeng@zhuyupeng-PC ~
$ 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

#注意區別,加‘{}’則不打印文件
zhuyupeng@zhuyupeng-PC ~
$ 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的后綴部分
 
#替換,目標串使用正則表達式格式‘//’
zhuyupeng@zhuyupeng-PC ~
$ awk 'gsub(/4842/,4899) {print $0}' grade.txt
J.Troll 07/99   4899    Brown-3 12      26      26
 
#查詢字符串第一次出現的位置,注意使用BEGIN,否則每一行都會打印,字符串使用引號括起來
zhuyupeng@zhuyupeng-PC ~
$ awk 'BEGIN{print index("Bunny","ny")}' grade.txt
4
 
#長度
zhuyupeng@zhuyupeng-PC ~
$ awk '$1=="J.Troll" {print length($1)" "$1}' grade.txt
7 J.Troll

#match 使用: 找不到返回0,找到返模式串在匹配串中的位置
#注:單獨使用 加BEGIN
zhuyupeng@zhuyupeng-PC ~
$ awk 'BEGIN {print match("ANCD",/d/)}'
0

#以下兩種模式都正確
zhuyupeng@zhuyupeng-PC ~
$ awk '$1=="J.Lulu" {print match($1,"u")}' grade.txt
4
 
zhuyupeng@zhuyupeng-PC ~
$ awk '$1=="J.Lulu" {print match($1,/u/)}' grade.txt
4

#split 返回字符串數組元素個數
zhuyupeng@zhuyupeng-PC ~
$ awk 'BEGIN {print split("123#456#789",myarray,"#");print myarray[1],myarray[2],myarray[3]}'
3
123 456 789

#sub,發現並替換模式的第一個位置
zhuyupeng@zhuyupeng-PC ~
$ 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,返回字符串指定范圍內的子串
zhuyupeng@zhuyupeng-PC ~
$ awk '$1=="L.Tansley" {print substr($1,1,5)}' grade.txt
L.Tan

#使用substr返回指定位置開始的后綴部分,范圍只給了一個參數,注意和上一個例子相對比
zhuyupeng@zhuyupeng-PC ~
$ awk '{print substr($1,3)}' grade.txt
Tansley
Lulu
Bunny
Troll
Tansley

#從shell中向awk傳遞字符串,通過 echo 加管道的方式
zhuyupeng@zhuyupeng-PC ~
$ echo "Test" | awk '{print length($0)}'
4
 
zhuyupeng@zhuyupeng-PC ~
$ STR="mydoc.txt"
 
zhuyupeng@zhuyupeng-PC ~
$ echo $STR | awk '{print substr($STR,7)}'
txt



免責聲明!

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



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