• AWK编程语言笔记第一章:基础语法


    1 AWK 命令
    pattern { action }
    
    • 1

    pattern表示模式匹配action表示操作,两者都是可选的,通过花括号进行区分。

    {action} 后可以追加多个文件,也可以使用 -f

    awk 'program' input files
    awk -f progfile optional list of input files
    
    • 1
    • 2

    构建数据:

    $ touch emp.data
    $ vi emp.data
    $ cat emp.data
    Beth 4.00 0
    Dan 3.75 0
    Kathy 4.00 10
    Mark 5.00 20
    Mary 5.50 22
    Susie 4.25 18
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    2 提取字段

    awk 通过$提取字段,字段从1开始,0则为整行。

    { print $1, $3 }
    { print $O }
    { print }
    
    • 1
    • 2
    • 3
    3 计算字段个数

    NF: number of fields,$NF表示最后一个字段。

    $ awk ' {print NF, $1, $NF}' emp.data
    3 Beth 0
    3 Dan 0
    ...
    
    • 1
    • 2
    • 3
    • 4
    4 计算已读行数

    NR:counts the number of lines read so far

    $ awk ' {print NR, $0}' emp.data
    1 Beth 4.00 0
    2 Dan 3.75 0
    ...
    
    • 1
    • 2
    • 3
    • 4
    5 在打印字段中添加文字
    $ awk '{print "line number:",NR, $0}' emp.data
    line number: 1 Beth 4.00 0
    line number: 2 Dan 3.75 0
    ...
    
    • 1
    • 2
    • 3
    • 4
    6 通过%打印不同格式
    $ awk '{printf("total pay for %s is $%.2f\n", $1, $2 * $3)}' emp.data
    total pay for Beth is $0.00
    total pay for Dan is $0.00
    ...
    
    # -8表示8个字符并向左对齐
    $ awk '{ printf("%-8s $%6.2f\n", $1, $2 * $3) }' emp.data
    Beth     $  0.00
    Dan      $  0.00
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    7 运算符
    $ awk '$3>0 {print $1, $2*$3}' emp.data
    Kathy 40
    Mark 100
    ...
    
    $ awk '$2 >=5 || $3 >= 20 {print $0}' emp.data
    Mark 5.00 20
    Mary 5.50 22
    
    $ awk '$1=="Susie" {print $0}' emp.data
    Susie 4.25 18
    
    $ awk '!($2<5 && $3<20) {print $0}' emp.data
    Mark 5.00 20
    Mary 5.50 22
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    8 BEGIN 和 END

    特殊模式BEGIN在读取第一个输入文件的第一行之前匹配,END在处理最后一个文件的最后一行之后匹配。

    # print "", 打印空白行
    $ awk 'BEGIN { print "NAME RATE HOURS";print ""}{print}' emp.data
    NAME RATE HOURS
    
    Beth 4.00 0
    Dan 3.75 0
    ...
    
    $ awk '{pay=pay+$2*$3} 
    END {print NR, "employees"                                      
    print "total pay is ", pay
    print "average pay is", pay/NR}' emp.data
    6 employees
    total pay is  337.5
    average pay is 56.25
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    9 字符处理
    # 像处理数字一样处理文本
    $ awk '$2>maxrate {maxrate=$2;maxemp=$1}
    END {print "highest hourly rate:",maxrate,"for",maxemp}' emp.data
    highest hourly rate: 5.50 for Mary
    
    # 字符串连接
    $ awk '{names=names $1 " "} END {print names}' emp.data
    Beth Dan Kathy Mark Mary Susie
    
    # 打印最后一行
    $ awk '{last =$0} END {print last}' emp.data
    Susie 4.25 18
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    10 内置函数
    $ awk '{print $1, length($1)}' emp.data
    Beth 4
    Dan 3
    ...
    
    $ awk '{nc=nc+length($0)+1
     nw=nw+NF}
     END {print NR , "lines,",nw,"words,",nc,"characters"}' emp.data
    6 lines, 18 words, 77 characters
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    11 控制流
    $ awk '$2>6 {n=n+1;pay=pay+$1*$3}
    END {if (n>0)
        print n, "employees, total pay is",pay
       else
        print "no employees are paid more than $6/hour"
      }' emp.data
    no employees are paid more than $6/hour
    
    $ awk '{i=1;while(i <=2){print $1;i=i+1}}' emp.data
    
    $ awk '{for (i=1;i<=3;i++) printf $2}' emp.data
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    12 处理数组

    line[NR]=$0,将每行赋值到line数组中。

    ~$ awk '{line[NR]=$0} END {i=NR;while (i>0){print line[i];i--}}' emp.data
    Susie 4.25 18
    Mary 5.50 22
    ...
    
    • 1
    • 2
    • 3
    • 4
    13 One-liners

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    在ubuntu用wine安装微信 并解决无法输入文字的问题 ubuntu完美安装微信
    【JavaWeb】一篇文章掌握Servlet
    Arthas调优工具使用
    Golang+etcd的分布式锁
    Windows11右键菜单修改为Win10模式的方法
    STL算法 ——函数对象(仿函数)【仿函数、谓词、内建函数对象、适配器】
    SpringBoot集成Thymeleaf——关闭页面缓存——设置热部署
    李超线段树
    稳进的科大讯飞,重点赛道多点开花
    day5-selenium的高级和实战
  • 原文地址:https://blog.csdn.net/mengjizhiyou/article/details/127214866