免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2999 | 回复: 4
打印 上一主题 下一主题

[文本处理] [分享]awk多文件操作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-12-04 16:31 |只看该作者 |倒序浏览
本帖最后由 关中落叶 于 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值,如

同时,我们有已经准备好的该物种基因的注释文件,如

现在,我们要完成不同样本中有表达基因的功能注释工作。通过观察,我们可以发现两个文件的第一列均为基因名称,因此我们可以通过下述代码实现
  1. 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的内容一起输出,得到如下内容:

还有其他几个简单的案例,请大家扫描二维码查看,顺便帮我增加一些点击率,谢谢啦





论坛徽章:
0
2 [报告]
发表于 2016-12-04 16:38 |只看该作者
排版有点问题,我第一次在这里发帖,弄了好几遍都没弄好,大家凑活着看吧。
然后,如果有人知道发帖时候怎么上传本地图片,可以告诉我一下吗?

论坛徽章:
0
3 [报告]
发表于 2016-12-05 15:18 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2016-12-09 08:21 |只看该作者
没有过时的技术,只有不适合的技术。
生物信息分析基本上都是在Linux环境下完成,
对于普通的数据处理 awk+sed是绝配。

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
5 [报告]
发表于 2016-12-09 11:02 |只看该作者

  1. awk 'NR==FNR{match($0,/([^\t]*)\t(.*)/,a);b[a[1]]=a[2];next}b[$1]{print $0,b[$1]}' OFS=\\t annotation.txt fpkm.txt > fpkm.anno.txt
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP