美文网首页shell生信技巧
AWK是门大学问(下)

AWK是门大学问(下)

作者: 刘小泽 | 来源:发表于2019-05-04 18:37 被阅读109次

    刘小泽写于19.5.4
    这次来看看AWK的各种运算操作符以及条件判断

    示例文件

    文件一

    新建一个文件,有4列:员工ID、姓名、职位、薪水

    cat >employee-sal.txt
    101,John Doe,CEO,10000
    102,Jason Smith,IT Manager,5000
    103,Raj Reddy,Sysadmin,4500
    104,Anand Ram,Developer,4500
    105,Jane Miller,Sales Manager,3000
    

    下面可以输出每个人的薪水,并且计算总共发放的薪水

    awk -F, 'BEGIN {total=0} {print $2 " salary is: " $4; total+=$4} END {print "---\nTotal company salary = $"total}' employee-sal.txt
    
    John Doe salary is: 10000
    Jason Smith salary is: 5000
    Raj Reddy salary is: 4500
    Anand Ram salary is: 4500
    Jane Miller salary is: 3000
    ---
    Total company salary = $27000
    
    文件二
    cat >items.txt
    101,HD Camcorder,Video,210,10
    102,Refrigerator,Appliance,850,2
    103,MP3 Player,Audio,270,15
    104,Tennis Racket,Sports,190,20
    105,Laser Printer,Office,475,5
    

    一元运算操作符 Unary Operators

    一元运算具有一个参数

    操作符 描述
    + 返回数字本身
    - 相反数
    ++ 累加
    -- 累减

    比如要对某一列数字取相反数,直接在这一列的变量前面加-即可

    awk -F, '{print -$4}' employee-sal.txt
    -10000
    -5000
    -4500
    -4500
    -3000
    

    关于累加、累减的符号方向问题:

    • 如果将++或者 放在变量名之前,它会先把这一列数字全部加一或减一,再输出

      awk -F, '{print ++$4}' employee-sal.txt
      10001
      5001
      4501
      4501
      3001
      
    • 如果放在变量名之后,会先输出,再全部加一或减一

      # 如果只这样输出的话,只会先输出计算之前的
      awk -F ',' '{print $4++}' employee-sal.txt
      10000
      5000
      4500
      4500 
      3000
      # 如果想输出计算后的,那么就需要再print一下
      awk -F ',' '{$4++; print $4}' employee-sal.txt
      10001
      5001
      4501
      4501
      3001
      

    记做:++或--在前,先输出;在后,后输出

    字符串操作符

    主要使用空格,将两个字符串连接起来。中间空格数量不限,保证至少有一个,另外=前后也是可以有空格的,这个不影响

    例如:

    awk 'BEGIN{str1="Bioinfo"; str2="planet"; str3=str1 str2; print str3}'
    Bioinfoplanet
    

    逻辑运算

    处理> <以外,判断等于用==,不等于用!= ,表示&&||

    使用逻辑值判断时,默认将符合条件的全行输出,如:

    # 小于等于
    awk -F "," '$5 <= 5' items.txt
    102,Refrigerator,Appliance,850,2
    105,Laser Printer,Office,475,5
    # 等于
    awk -F "," '$1 == 103' items.txt
    103,MP3 Player,Audio,270,15
    
    #满足条件指定输出其他项
    awk -F "," '$1 == 103 {print $2}' items.txt
    MP3 Player
    
    # 不等于
    awk -F "," '$3 != "Video"' items.txt
    102,Refrigerator,Appliance,850,2
    103,MP3 Player,Audio,270,15
    104,Tennis Racket,Sports,190,20
    105,Laser Printer,Office,475,5
    # 多个逻辑判断 &&
    awk -F "," '$4 < 900 && $5 <= 5' items.txt
    102,Refrigerator,Appliance,850,2
    105,Laser Printer,Office,475,5
    # 多个判断后指定输出
    awk -F "," '$4 < 900 && $5 <= 5 {print $2}' items.txt
    Refrigerator
    Laser Printer
    # 使用||判断d
    awk -F "," '$4 < 900 || $5 <= 5 {print $2}' items.txt
    

    正则表达

    当使用==时,awk会从头到尾检查一遍,只有全部满足条件的,才可以输出

    比如:

    awk -F, '{print $2}' items.txt
    HD Camcorder
    Refrigerator
    MP3 Player
    Tennis Racket
    Laser Printer
    

    如果这里要挑出带有Laser的,使用awk -F "," '$2 == "Tennis"' items.txt 就没有结果,这时就要用到匹配操作符~

    awk -F "," '$2 ~ "Laser"' items.txt
    105,Laser Printer,Office,475,5
    

    与之相反的是!~ ,表示不包含

     awk -F "," '$2 !~ "Laser"' items.txt
    

    条件判断

    一般使用:

    • Simple If statement
    • If-Else statement
    第一种简单的if判断

    if (条件判断) 操作,并且可以支持多个操作,放在一个大括号中就好if (条件判断) {操作1;操作2}

    比如输出items文件中最后一列数量小于等于5

    awk -F, '{if ($5<=5) print "Only",$5,"qty of",$2, "is available"}' items.txt
    Only 2 qty of Refrigerator is available
    Only 5 qty of Laser Printer is available
    

    再复杂一点,找到第四列的价位在500~1000之间,并且数量小于5的

    awk -F, '{if (($4>=500 && $4<=1000) && ($5<=5)) print "Only",$5,"qty of",$2,"is available"}' items.txt
    Only 2 qty of Refrigerator is available
    
    第二种 if-else

    大体操作就是

    if (条件判断,可以有多个,其中每个判断都要写在小括号中)
        操作1
    else
        操作2
    

    循环

    While循环
    • 简单的while模式,例如

      awk 'BEGIN \
      { while (count++<50) string=string "x"; print string }'
      
    • do-while循环,使用do action while(condition)的结构,例如

      awk 'BEGIN {count=1;do print "At least once"; while(count!=1)}'
      
    For循环

    它的语法是这样的:

    for(initialization;condition;increment/decrement)
    actions
    

    比如:

    echo "1 2 3 4" | awk \
    '{ for (i = 1; i <= NF; i++) total = total+$i }; \
    END { print total }'
    # 结果就是累加值 10
    

    欢迎关注我们的公众号~_~  
    我们是两个农转生信的小硕,打造生信星球,想让它成为一个不拽术语、通俗易懂的生信知识平台。需要帮助或提出意见请后台留言或发送邮件到jieandze1314@gmail.com

    Welcome to our bioinfoplanet!

    相关文章

      网友评论

        本文标题:AWK是门大学问(下)

        本文链接:https://www.haomeiwen.com/subject/lkrfoqtx.html