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

2022-08-12 02:52:13, 牛大 上海欧易生物医学科技有限公司


 
生物信息分析的大部分工作是在处理各种各样的表格、统计不同的数据。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的使用方法及简化,敬请期待……


往期热文


@一步一步,如魔鬼的步伐--教你制作简单的network图

@BiNGO!GO分析动起来!

@[生物信息]如何绘制曼哈顿图manhattan Plot

@特殊样本,该如何更好的进行实验?

@“易时代”欧易品牌卡通形象设计大赛作品全面火爆征集,万元奖金等你来拿





  • 客服电话: 400-6699-117 转 1000
  • 京ICP备07018254号
  • 电信与信息服务业务经营许可证:京ICP证110310号
  • 京公网安备1101085018
  • 客服电话: 400-6699-117 转 1000
  • 京ICP备07018254号
  • 电信与信息服务业务经营许可证:京ICP证110310号
  • 京公网安备1101085018

Copyright ©2007-2024 ANTPEDIA, All Rights Reserved