Brassicanapus的个人博客分享 http://blog.sciencenet.cn/u/Brassicanapus

博文

gene GO注释信息归类打印

已有 1966 次阅读 2019-6-21 17:59 |个人分类:perl|系统分类:科研笔记

提前说明:文中所有¥均为$的替代,看官们在用的时间替换回来即可。文本提交后总有部分$符号不能正常显示,不得已使用¥代替$,没想到居然均可以正常显示,看来还是人民币魅力大啊


下载到油菜darmor参考基因组GO注释文件,发现其格式是如下格式:


BnaC09g12820D GO:0046983


BnaC09g12810D GO:0003922


BnaC09g12810D GO:0004066


BnaC09g12810D GO:0005524


BnaC09g12810D GO:0006164


BnaC09g12810D GO:0006177


BnaC09g12810D GO:0006529


BnaC09g12810D GO:0016462


文章发表通常需要


BnaC09g12810DGO:0004066 GO:0005524 GO:0006164 GO:0006177 GO:0006529 GO:0016462形式,本文将通过perl脚本实现格式转换。


#!/usr/bin/perl


#usage:classify_print.pl list.file target.file out.file


open LIST,¥ARGV[0];     #gene list文件,该list文件包含所有无冗余的gene编号


open FILE,¥ARGV[1];     #需要编辑的GO注释文件


open OUT,">¥ARGV[2]";   #结果输入文件


chomp(@list=<LIST>);#list文件赋值到@list


chomp(@file=<FILE>);#原始GO文件赋值到@file


for(@file){


        chomp;


        (  ¥col1,  ¥col2 )=split; #将GO文件的行内容分割为变量¥col1与 ¥col2


        push @{ ¥col1 }, ¥col2; #把变量¥col2存储进以¥col1值为数据名称的数组中


        }


for(@list){


        print OUT  " ¥_\t@{ ¥_}\n"; #把结果打印到脚本的第三个参数,即输出文件中


        }


此脚本引入了额外的文件-list,需要提前通过excel或shell 的cut与uniq命令来获取,如果不引入该参数该如何实现同一个gene的GO信息归类到一行显示呢?


perl -e 'chomp(@all=sort <>);¥gene=(split /\s+/,¥all[0])[0];for(@all){my(¥col1,¥col2)=split;if(¥gene eq ¥col1){push @{¥gene},¥col2}else{print "¥gene\t@{¥gene}\n";¥gene=¥col1;push @{¥gene},¥col2}}print "¥gene\t@{¥gene}\n";' GO.file


即可。如何转化为脚本如下


#!/usr/bin/perl


#usage:classify_print.pl  target.file out.file


open FILE,¥ARGV[1];     #需要编辑的GO注释文件


open OUT,">¥ARGV[2]";   #结果输入文件


chomp(@all=sort <FILE>);#必须排序


¥gene=(split /\s+/,¥all[0])[0];#把排序后得到的数组第一个元素的第一列数据赋值到变量¥gene


for(@all){                                #遍历数组@all,其元素内容与格式为BnaC09g12820D GO:0046983


    my(¥col1,¥col2)=split;        #分割数据@all的元素,分别赋值¥col1 与¥col2


    if(¥gene eq ¥col1){              #字符串比较务必使用“eq”,数字比较使用“=”


        push @{¥gene},¥col2


            }else{


                    print OUT"¥gene\t@{¥gene}\n";#打印上一个gene 及GO信息


                    ¥gene=¥col1;        #把新的基因编号赋值给¥gene


                    push @{¥gene},¥col2


        }


                }


print OUT "¥gene\t@{¥gene}\n";#输出最后一个gene的GO注释信息




https://blog.sciencenet.cn/blog-3416088-1186204.html

上一篇:perl map函数与数组切片组合使用实现文本列的提取
收藏 IP: 220.163.128.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (1 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-24 02:21

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部