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的使用方法及简化,敬请期待……
往期热文
@“易时代”欧易品牌卡通形象设计大赛作品全面火爆征集,万元奖金等你来拿
03-28 麦特绘谱
绘谱学堂 | 4月10日15:00开讲《代谢组学助力心血管疾病研究》03-28 麦特绘谱
Cell Metab | 巨噬细胞的代谢支持维持结肠上皮细胞稳态03-28 麦特绘谱
非酒精性脂肪肝赛道大热!绘云生物走进精准医疗的“黄金时代”03-28 绘云生物
药物合成必杀技:玩转烯烃复分解反应【文末有福利】03-28 默克生命科学
成功讲座!默克与天津制药企业深入合作,助力行业布局03-28
焕新升级,科研赋能03-28 珀金埃尔默
解密生活饮用水中的铝含量:石墨炉原子吸收法的应用03-28 珀金埃尔默
实验室运营好帮手 | 珀金埃尔默租赁服务火热依旧03-28 珀金埃尔默
小“珀”图 | 一秒定输赢,揭秘F1赛车中的分析技术应用03-28 珀金埃尔默
复星、恒瑞、康方、科伦博泰……众多大咖齐聚2024中国医药创新100峰会03-28
是的,你的社区换新啦(点击有03-28
赋能新污染物标准升级,助力环保“新质生产力”提升03-28 飞飞
补铁要补三价铁还是二价铁?赛默飞带您细探究竟03-28 飞飞
重磅!首个毛发中滥用药物及其代谢物国标4月1日发布实施,55种!03-28 分析中心
新污染物检测特色分析技术——红外拉曼显微镜助力微塑料化学成像可视化分析03-28 创新中心
海外展会预告——莱伯泰科邀您相约慕尼黑国际分析生化博览会(analytica 2024)03-28
耗材专区 | EZscan,让热解析管的管理变简单!03-28
耗材专区 | EZsep™WAX固相萃取柱应用于肉制品中合成着色剂的检测03-28
特洁安TrojanUV Signa™助力夏威夷污水厂紫外线消毒升级03-28 特洁安