您的位置:首页 > 其它

awk 实例练习(二)

2016-04-30 18:44 337 查看
上一篇,这里使用的grade.txt
也是和上一篇中的相同。
先来总结一下awk内置变量:

[align=left]ARGC 命令行参数个数[/align]
[align=left]ARGV 命令行参数排列[/align]
[align=left]ENVIRON 支持队列中系统环境变量的使用[/align]
[align=left]FILENAME awk浏览文件名[/align]
[align=left]FNR 浏览文件的记录数[/align]
[align=left]FS 设置输入域分隔符,等价于命令行-F选项[/align]
[align=left]NF 浏览记录的域个数[/align]
[align=left]NR 已读的记录数[/align]
[align=left]OFS 输出域分隔符[/align]
[align=left]ORS 输出例句分隔符[/align]
[align=left]RS 控制记录分隔符[/align]
[align=left] [/align]
[align=left] [/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ 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
[align=left]grade.txt[/align]
[align=left] [/align]

#使用 -F
参数指定分隔符

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ echo
$PWD
[align=left]/home/zhuyupeng[/align]
[align=left] [/align]
[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ echo
$PWD | awk -F/ '{print $NF"\t"NF}'
[align=left]zhuyupeng 3[/align]

#设置变量名,将27
赋值给变量BASELINE

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'BEGIN {BASELINE="27"} $6<BASELINE {print $0}' grade.txt
[align=left]J.Lulu 06/99 48317 green 9 24 26[/align]
[align=left]J.Troll 07/99 4842 Brown-3 12 26 26[/align]

[align=left]#修改数值域取值,注意‘{}’[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'{if($1=="M.Tansley") $6=$6-1; print $1,$6,$7}' grade.txt
[align=left]M.Tansley 39 44[/align]
[align=left]J.Lulu 24 26[/align]
[align=left]P.Bunny 35 28[/align]
[align=left]J.Troll 26 26[/align]
[align=left]L.Tansley 30 28[/align]

[align=left] [/align]

[align=left]#修改文本域取值[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'{if($1=="J.Troll") $1="J.L.Troll"; print $1}' grade.txt
[align=left]M.Tansley[/align]
[align=left]J.Lulu[/align]
[align=left]P.Bunny[/align]
[align=left]J.L.Troll[/align]
[align=left]L.Tansley[/align]

#创建新的输出域,这里新的输出域为
diff

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'BEGIN {print "Name \t Difference"} {if($6<$7) {diff=$7-$6; print $1,diff}}' grade.txt
[align=left]Name Difference[/align]
[align=left]M.Tansley 4[/align]
[align=left]J.Lulu 2[/align]
[align=left] [/align]

#统计某一个域的和,使用‘+=’
下面的例子统计第六个域的和

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'(tot+=$6); END{print "Club student total points: " tot}' grade.txt
[align=left]M.Tansley 05/99 48311 Green 8 40 44[/align]
[align=left]J.Lulu 06/99 48317 green 9 24 26[/align]
[align=left]P.Bunny 02/99 48 Yellow 12 35 28[/align]
[align=left]J.Troll 07/99 4842 Brown-3 12 26 26[/align]
[align=left]L.Tansley 05/99 4712 Brown-2 12 30 28[/align]
[align=left]Club student total points: 155[/align]

[align=left]#注意区别,加‘{}’则不打印文件[/align]
[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'{(tot+=$6)}; END{print "Club student total points: " tot}' grade.txt
[align=left]Club student total points: 155[/align]

[align=left]awk 内置字符串函数[/align]
[align=left] [/align]
[align=left]gsub(r,s) 在整个$0中用s替代r[/align]
[align=left]gsub(r,s,t) 在整个t中使用s替代r[/align]
[align=left]index(s,t) 在返回s中字符串t的第一个位置[/align]
[align=left]length(s) 放回s长度[/align]
[align=left]match(s,r) 测试s是否包含匹配r的字符串[/align]
[align=left]split(s,a,fs) 在fs上将s分成序列a[/align]
[align=left]sprint(fmt,exp) 返回经fmt格式化后的exp[/align]
[align=left]sub(r,s) 用$0中最左边最长的子串代替s[/align]
[align=left]substr(s,p) 返回字符串s中从p开始的后缀部分[/align]
[align=left]substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分[/align]

[align=left] [/align]

[align=left]#替换,目标串使用正则表达式格式‘//’[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'gsub(/4842/,4899) {print $0}' grade.txt
[align=left]J.Troll 07/99 4899 Brown-3 12 26 26[/align]

[align=left] [/align]

[align=left]#查询字符串第一次出现的位置,注意使用BEGIN,否则每一行都会打印,字符串使用引号括起来[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'BEGIN{print index("Bunny","ny")}' grade.txt
[align=left]4[/align]
[align=left] [/align]

[align=left]#长度[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'$1=="J.Troll" {print length($1)" "$1}' grade.txt
[align=left]7 J.Troll[/align]

#match
使用: 找不到返回0,找到返模式串在匹配串中的位置,

[align=left]#注:单独使用 加BEGIN[/align]
[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'BEGIN {print match("ANCD",/d/)}'
[align=left]0[/align]

[align=left]#以下两种模式都正确[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'$1=="J.Lulu" {print match($1,"u")}' grade.txt
[align=left]4[/align]
[align=left] [/align]
[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'$1=="J.Lulu" {print match($1,/u/)}' grade.txt
[align=left]4[/align]

#split
返回字符串数组元素个数

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'BEGIN {print split("123#456#789",myarray,"#");print myarray[1],myarray[2],myarray[3]}'
[align=left]3[/align]
[align=left]123 456 789[/align]

[align=left]#sub,发现并替换模式的第一个位置[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'$1=="J.Troll" {sub(26,29,$0)} {print $0}' grade.txt
[align=left]M.Tansley 05/99 48311 Green 8 40 44[/align]
[align=left]J.Lulu 06/99 48317 green 9 24 26[/align]
[align=left]P.Bunny 02/99 48 Yellow 12 35 28[/align]
J.Troll 07/99 4842 Brown-3 12 29
26
[align=left]L.Tansley 05/99 4712 Brown-2 12 30 28[/align]
[align=left] [/align]

[align=left]#substr,返回字符串指定范围内的子串[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ awk
'$1=="L.Tansley" {print substr($1,1,5)}' grade.txt
[align=left]L.Tan[/align]

[align=left]#使用substr返回指定位置开始的后缀部分,范围只给了一个参数,注意和上一个例子相对比[/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
[align=left]$ awk '{print substr($1,3)}' grade.txt[/align]
[align=left]Tansley[/align]
[align=left]Lulu[/align]
[align=left]Bunny[/align]
[align=left]Troll[/align]
[align=left]Tansley[/align]

#从shell中向awk传递字符串,通过
echo 加管道的方式

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ echo
"Test" | awk '{print length($0)}'
[align=left]4[/align]

[align=left] [/align]

[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
[align=left]$ STR="mydoc.txt"[/align]
[align=left] [/align]
[align=left]zhuyupeng@zhuyupeng-PC ~[/align]
$ echo
$STR | awk '{print substr($STR,7)}'
[align=left]txt[/align]

make it simple, make it happen
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: