本帖最后由 关中落叶 于 2016-12-04 16:35 编辑
本文主要讲解使用awk操作多个文件时,如何建立映射关系。文章内容系本人原创,部分内容参考其他文章,欢迎转载。
生物信息分析的大部分工作是在处理各种各样的表格、统计不同的数据。awk是一个优秀的文本处理工具,熟练使用awk操作数据框是生信分析必备技能之一。相信很多人在刚开始接触awk语法时,都被数组处理搞得“欲仙欲死”。我在学习awk过程中也经常上网查阅一些资料,但是网上的相关资料要么是过于简单,要么是不知所云。今天在这里将自己整理的一点心得同大家分享,通过列举几个awk数组处理的实例来强化训练。
语法首先简单说明一下awk的语法。awk的操作可能会比较复杂,但是语法确相对简单——awk [options] ‘BEGIN{} {commands} END{}’ file其中options表示参数设定,例如-F指定分隔符、-v定义变量等;BEGIN和END分别为初始和结尾代码块,分别在对每一行数据处理前后执行;commands是对数据行执行的一系列命令,这是我们今天要陈述的重点区域。数组处理举一个生信分析常见的案例,转录组分析完成基因定量之后获得了不同基因在各个样本中表达的fpkm值,如
![]()
同时,我们有已经准备好的该物种基因的注释文件,如
![]()
现在,我们要完成不同样本中有表达基因的功能注释工作。通过观察,我们可以发现两个文件的第一列均为基因名称,因此我们可以通过下述代码实现
- awk 'BEGIN{FS=OFS="\t"}NR==FNR{a[$1]=$1;b[$1]=$2"\t"$3"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8}NR>FNR{if($1==a[$1]) print $0,b[$1]}' annotation.txt fpkm.txt > fpkm.anno.txt
复制代码![]()
对上述代码进行解读: 首先通过BEGIN{FS=OFS="\t"}定义了文件输入和输出的分隔符均为tab; 然后通过NR==FNR将操作对象定义为annotation.txt文件,其中NR为awk开始执行程序后所读取的数据行数,而FNR与NR功用类似,但是每打开一个新文件后,FNR便从0重新累计; 接下来通过a[$1]=$1定义了数组a的属性值(key)和对应值(value),其中$num为操作文件的第num列,意思是我们定义了一种映射关系,即annotation.txt文件第1列的每一个name名称(key)的对应值为其本身(value),如下图所示: 那么b[$1]=$2”\t”$3”\t”$4”\t”$5”\t”$6”\t”$7”\t”$8便好理解了——我们又定义了一种新的映射数组b,即annotation.txt文件的第1列的每一个name名称(key)的对应值为2-8列的内容(value),如下图所示:
![]()
紧接着通过NR>FNR将awk的操作对象定义为fpkm.txt文件;最后通过if(a[$1]==$1)来将数组a的映射关系同fpkm.txt的第1列name名称相匹配,并通过print $0,b[$1]将fpkm.txt同数组b合并后打印出来,这句代码是今天所讲的重中之重!再次强调,NR>FNR已经将操作对象定义为fpkm.txt文件,所以之后的代码中出现的$1和$0都对应的是fpkm.txt文件。对于a[$1]==$1而言,第一个$1是将fpkm.txt第1列的内容作为数组a的下标,第二个$1是fpkm.txt第1列的内容本身。其实就是看fpkm.txt第1列的内容和annotation.txt第1列的内容能匹配上不,匹配上就输出,如下图所示:
![]()
接下来就简单了,print $0,b[$1]就是将fpkm.txt的每一列($0)和数组b的内容一起输出,得到如下内容:
![]()
还有其他几个简单的案例,请大家扫描二维码查看,顺便帮我增加一些点击率,谢谢啦
![]()
|