zoukankan      html  css  js  c++  java
  • 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


  • 相关阅读:
    Python自动化运维之28、Django(二)
    Python自动化运维之27、Django(一)
    Python自动化运维之26、Web框架本质、MVC与MTV
    Python自动化运维之25、Ajax
    高级接口--高级群发接口
    高级接口--用户标签管理
    高级接口--获取用户基本信息
    高级接口--获取用户地理位置
    高级接口--生成带参数二维码
    高级接口--OAuth2.0网页授权
  • 原文地址:https://www.cnblogs.com/zhuyp1015/p/2591842.html
Copyright © 2011-2022 走看看