||
提前说明:文中所有¥均为$的替代,看官们在用的时间替换回来即可。文本提交后总有部分$符号不能正常显示,不得已使用¥代替$,没想到居然均可以正常显示,看来还是人民币魅力大啊。
下载到油菜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注释信息
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-4-24 02:21
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社