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

2019-08-20  本文已影响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的使用我也在学习当中,希望能够更加纯熟地掌握,以后就可以适当“偷懒”啦~!

上一篇 下一篇

猜你喜欢

热点阅读