• (16)awk流程控制之break、continue、next、nextfile、exit语句


    break和continue

    break可退出for、while、do...while、switch语句。

    continue可让for、while、do...while进入下一轮循环。

    [root@docker-01 ~]# awk '
    > BEGIN{
    >   for(i=0;i<10;i++){
    >     if(i==5){
    >       break
    >     }
    >     print(i)
    >   }
    > 
    >   # continue
    >   for(i=0;i<10;i++){
    >     if(i==5)continue
    >     print(i)
    >   }
    > }'
    0
    1
    2
    3
    4
    0
    1
    2
    3
    4
    6
    7
    8
    9

    next和nextfile

    next会在当前语句处立即停止后续操作,并读取下一行,进入循环顶部。

    例如,输出除第3行外的所有行。

    [root@docker-01 ~]# awk 'NR==3{next}{print}' a.txt
    ID  name    gender  age  email          phone
    1   Bob     male    28   abc@qq.com     18023394012
    3   Tony    male    21   aaa@163.com    17048792503
    4   Kevin   male    21   bbb@189.com    17023929033
    5   Alex    male    18                  18185904230
    6   Andy    female  22   ddd@139.com    18923902352
    7   Jerry   female  25   exdsa@189.com  18785234906
    8   Peter   male    20   bax@qq.com     17729348758
    9   Steven  female  23   bc@sohu.com    15947893212
    10  Bruce   female  27   bcbd@139.com   13942943905
    [root@docker-01 ~]# awk 'NR==3{getline}{print}' a.txt
    ID  name    gender  age  email          phone
    1   Bob     male    28   abc@qq.com     18023394012
    3   Tony    male    21   aaa@163.com    17048792503
    4   Kevin   male    21   bbb@189.com    17023929033
    5   Alex    male    18                  18185904230
    6   Andy    female  22   ddd@139.com    18923902352
    7   Jerry   female  25   exdsa@189.com  18785234906
    8   Peter   male    20   bax@qq.com     17729348758
    9   Steven  female  23   bc@sohu.com    15947893212
    10  Bruce   female  27   bcbd@139.com   13942943905

    nextfile会在当前语句处立即停止后续操作,并直接读取下一个文件,并进入循环顶部。

    例如,每个文件只输出前2行:

    [root@docker-01 ~]# awk 'FNR==3{nextfile}{print}' a.txt a.txt
    ID  name    gender  age  email          phone
    1   Bob     male    28   abc@qq.com     18023394012
    ID  name    gender  age  email          phone
    1   Bob     male    28   abc@qq.com     18023394012

    exit

    exit [exit_code]

    直接退出awk程序。

    注意,END语句块也是exit操作的一部分,所以在BEGIN或main段中执行exit操作,也会执行END语句块。

    如果exit在END语句块中执行,则立即退出。

    所以,如果真的想直接退出整个awk,则可以先设置一个flag变量,然后在END语句块的开头检查这个变量再exit。

    BEGIN{
        ...code...
        if(cond){
            flag=1
            exit
        }
    }
    {}
    END{
        if(flag){
            exit
        }
        ...code...
    }
    
    awk '
        BEGIN{print "begin";flag=1;exit}
        {}
        END{if(flag){exit};print "end2"}
    ' 

    exit可以指定退出状态码,如果触发了两次exit操作,即BEGIN或main中的exit触发了END中的exit,且END中的exit没有指定退出状态码时,则采取前一个退出状态码。

    [root@docker-01 ~]# awk 'BEGIN{flag=1;exit 2}{}END{if(flag){exit 1}}' 
    [root@docker-01 ~]# echo $?
    1
    [root@docker-01 ~]# awk 'BEGIN{flag=1;exit 2}{}END{if(flag){exit}}' 
    [root@docker-01 ~]# echo $?
    2
  • 相关阅读:
    依赖倒置原则(Dependency Inversion Principle)
    里氏替换原则(Liskov Substitution Principle)
    vue.js如何在标签属性中插入变量参数
    SpringBoot解决ajax跨域问题
    WebBrowser(IE) 与 JS 相互调用
    WebBrowser引用IE版本问题,更改使用高版本IE
    win10下端口被占用解决办法
    vim撤销undo与反撤销redo
    centos 安装sbt
    idea中使用scala运行spark出现Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/GenTraversableOnce$class
  • 原文地址:https://www.cnblogs.com/liujunjun/p/12397922.html
Copyright © 2020-2023  润新知