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的使用我也在学习当中,希望能够更加纯熟地掌握,以后就可以适当“偷懒”啦~!
网友评论