• 主页
  • 课程

    关于课程

    • 课程归档
    • 成为一名讲师
    • 讲师信息
    教学以及管理操作教程

    教学以及管理操作教程

    ¥1,000.00 ¥100.00
    阅读更多
  • 特色
    • 展示
    • 关于我们
    • 问答
  • 事件
  • 个性化
  • 博客
  • 联系
  • 站点资源
    有任何问题吗?
    (00) 123 456 789
    weinfoadmin@weinformatics.cn
    注册登录
    恒诺新知
    • 主页
    • 课程

      关于课程

      • 课程归档
      • 成为一名讲师
      • 讲师信息
      教学以及管理操作教程

      教学以及管理操作教程

      ¥1,000.00 ¥100.00
      阅读更多
    • 特色
      • 展示
      • 关于我们
      • 问答
    • 事件
    • 个性化
    • 博客
    • 联系
    • 站点资源

      生信星球

      • 首页
      • 博客
      • 生信星球
      • AWK是门大学问(下)

      AWK是门大学问(下)

      • 发布者 weinfoeditor
      • 分类 生信星球
      • 日期 2019年5月4日
      测试开头

       今天是生信星球陪你的第355天


         大神一句话,菜鸟跑半年。我不是大神,但我可以缩短你走弯路的半年~

         就像歌儿唱的那样,如果你不知道该往哪儿走,就留在这学点生信好不好~

         这里有豆豆和花花的学习历程,从新手到进阶,生信路上有你有我!

      豆豆写于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

      点击底部的“阅读原文”,获得更好的阅读体验哦😻

      初学生信,很荣幸带你迈出第一步。

      我们是生信星球,一个不拽术语、通俗易懂的生信知识平台。由于是2018年新号,竟然没有留言功能。需要帮助或提出意见请后台留言、联系微信或发送邮件到jieandze1314@gmail.com,每一条都会看到的哦~

      AWK是门大学问(下)


      测试结尾

      请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!

      • 分享:
      作者头像
      weinfoeditor

      上一篇文章

      好书|商业数据科学-您需要知道的数据挖掘和数据分析思维
      2019年5月4日

      下一篇文章

      图形|快速提高ggplot图的可读性和视觉吸引力的一步
      2019年5月5日

      你可能也喜欢

      8-1651673488
      生信零基础入门学习小组长期报名中(2022仍继续)
      7 4月, 2022
      2-1651673738
      简化版的ROC曲线
      21 2月, 2022
      8-1651674718
      支持向量机模型
      19 11月, 2021

      搜索

      分类

      • R语言
      • TCGA数据挖掘
      • 单细胞RNA-seq测序
      • 在线会议直播预告与回放
      • 数据分析那些事儿分类
      • 未分类
      • 生信星球
      • 老俊俊的生信笔记

      投稿培训

      免费

      alphafold2培训

      免费

      群晖配置培训

      免费

      最新博文

      Nature | 单细胞技术揭示衰老细胞与肌肉再生
      301月2023
      lncRNA和miRNA生信分析系列讲座免费视频课和课件资源包,干货满满
      301月2023
      如何快速批量修改 Git 提交记录中的用户信息
      261月2023
      logo-eduma-the-best-lms-wordpress-theme

      (00) 123 456 789

      weinfoadmin@weinformatics.cn

      恒诺新知

      • 关于我们
      • 博客
      • 联系
      • 成为一名讲师

      链接

      • 课程
      • 事件
      • 展示
      • 问答

      支持

      • 文档
      • 论坛
      • 语言包
      • 发行状态

      推荐

      • iHub汉语代码托管
      • iLAB耗材管理
      • WooCommerce
      • 丁香园论坛

      weinformatics 即 恒诺新知。ICP备案号:粤ICP备19129767号

      • 关于我们
      • 博客
      • 联系
      • 成为一名讲师

      要成为一名讲师吗?

      加入数以千计的演讲者获得100%课时费!

      现在开始

      用你的站点账户登录

      忘记密码?

      还不是会员? 现在注册

      注册新帐户

      已经拥有注册账户? 现在登录

      close
      会员购买 你还没有登录,请先登录
      • ¥99 VIP-1个月
      • ¥199 VIP-半年
      • ¥299 VIP-1年
      在线支付 激活码

      立即支付
      支付宝
      微信支付
      请使用 支付宝 或 微信 扫码支付
      登录
      注册|忘记密码?