美文网首页
Day31-awk求表格指定列最大最小值

Day31-awk求表格指定列最大最小值

作者: 腐草为嘤 | 来源:发表于2019-08-20 22:40 被阅读0次

        awk、grep和sed可以说是shell语言中文本处理的三剑客,如果能将此三者掌握得炉火纯青,基本上分割生信表格用不上什么脚本,都是一行命令搞定。
        其中尤以awk的用法多样最为突出,可以被当做一种专用的编程语言,内部能够处理循环判断等各种逻辑关系。
        在最近的工作中,我遇到了一些需要统计一个表格某一列最大最小值的情况,之前我只学了如何提取元素,那么怎样用awk去轻松处理这个更复杂的问题呢?


        首先,我们看一组示例数据:

    -bash-4.1$ cat test.txt
    #Sample Count
    A       10
    B       20
    C       15
    

        我们想要统计Count这一列的最大值,需要输入如下指令:

    grep -v "^#" test.txt | awk 'NR==1{max=$2;next}{max=max>$2?max:$2}END{print max}'
    

        输出的结果为20,也就是我们想要得到的结果。那么我们分解来看这个指令,前半段grep实际上是输出除去以#为开头的行,也就是我们表格的主体部分。
        管道符右边的awk指令END之前的指令可以分为两个部分来理解:第一部分是NR==1{max=$2;next},这里表示如果行数(NR)为1时,将第二列的值赋给max,是if判断的简便写法;第二部分是{max=max>$2?max:$2},这里指如果行数(NR)不为1,那么判断max是否大于此时第二列的值,如果是(?max就维持原值,如果不是(:)就令max赋上第二列的值。最后,输出max也就是所有第二列值中最大的那一个。
        怎么样,这样分解来看,是不是原本像乱码的awk代码就变得容易理解了呢?其实就是awk中判断语句的灵活运用。
        那么同理,最小值可以用以下指令来求:

    grep -v "^#" test.txt | awk 'NR==1{min=$2;next}{min=min<$2?min:$2}END{print min}'
    

        目前关于awk的使用我也在学习当中,希望能够更加纯熟地掌握,以后就可以适当“偷懒”啦~!

    相关文章

      网友评论

          本文标题:Day31-awk求表格指定列最大最小值

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