SEARCH
技术服务021-34781616

热门搜索关键词:转录组基因组甲基化酵母文库蛋白芯片

021-34781616

当前位置首页 » 新闻资讯 » 技术&解读&应用 » awk进阶(一) ——数组介绍

awk进阶(一) ——数组介绍

返回列表 来源: 查看手机网址
扫一扫!awk进阶(一) ——数组介绍扫一扫!
浏览:- 发布日期:2016-12-06 15:50:51【

生物信息分析的大部分工作是在处理各种各样的表格、统计不同的数据。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的内容一起输出,得到如下内容:

其他案例

案例1:新建两个示例文件a.txt和b.txt,内容如下:

用b.txt文件的第3列替代a.txt文件的第2列。

实现代码:awk 'BEGIN{FS=OFS="\t"}NR==FNR{a[$1]=$3;next} {print $1,a[$1],$3}' b.txt a.txt,此处略去“NR>FNR”(注意多了一个“next”)。

案例2:还是用上面的两个文件,比较 a.txt第一列的2-3字符和b.txt第二列的3-5 字符,如果相同,将b.txt的第二列与a.txt合并为c.txt

实现代码:awk -F "\t" 'NR==FNR{a[substr($2,3,5)]=$2}NR>FNR&&a[b=substr($1,2,3)]{print $0, a[b]}'b.txt a.txt,substr() 截取字符串

案例3:新建文件a.txt和b.txt

a.txt中第二列在b.txt中可能有可能没有,需要把有的匹配起来生成新的一列:要包含a.txt和b.txt的第一列,没有匹配的按照b.txt原来的格式进行输出。

实现代码:awk 'BEGIN{FS="[|,]";OFS=","}NR==FNR{a[$2]=$1;next}{print$1,$2,a[$2]}' a.txt b.txt

请大家自己在纸上画一画上述上述三个案例的映射关系,多动几下笔,很快就可以掌握awk的使用方法了。

今天的目的是为大家详细讲解awk数组处理时如何建立映射关系。awk还有许多更灵活、简便的使用方法,在最后三个案例中已经涉及到一些。关于更多awk的使用方法及简化,敬请期待……

推荐阅读

    【本文标签】:生物信息分析 awk 映射关系
    【责任编辑】:欧易生物版权所有:http://www.oebiotech.com转载请注明出处

    欧易生物

    技术热线:021-34781616 咨询热线:4006-4008-26

    上海市闵行区新骏环路138号5幢3层
    service@oebiotech.com
    欧易生物
    欧易生物微信公众号
    沪ICP备-050455 网站地图  Copyright © 2016 上海欧易生物医学科技有限公司 保留所有权利