前言
广告时间:觉得推文有用的,可以看下我的个人简介,关注下~
今天的脚本纯粹是练习下perl的操作符了,因为我暂时还不知道将这个流程能镶嵌到哪里。
将一个“gene” ID 与多个GO ID 转换为一行一个“gene” ID与一个GO ID,用perl脚本实现。但是只做格式整理,总觉得差点什么,所以用TBtools的功能“GO Term Parse”,当然,这部分功能我还不会用perl脚本直接实现。
这里用的输入文件为Trinotate注释的结果文件Trinotate.xls.gene_ontology
。
内容式这个样子的,两列直接以制表符
分割。
![](https://img.haomeiwen.com/i19940278/da79fd299017398d.png)
脚本运行
运行脚本
perl goID_one_per_line.pl Trinotate.xls.gene_ontology one_per_line.txt
检查结果GO ID数目是否与原文件相同
#检查结果文件one_per_line.txt 种GO ID数
wc -l one_per_line.txt
#检查输入文件Trinotate.xls.gene_ontology的 GO ID数
grep -o 'GO:' Trinotate.xls.gene_ontology | wc -l
结果文件one_per_line.txt
内容展示
![](https://img.haomeiwen.com/i19940278/e71c8e6999e8a747.png)
脚本代码
#!/usr/bin/perl -w
# Name:goID_one_per_line.pl
# Usage:
# perl goID_one_per_line.pl input_file output_file
use strict;
my $usage = "\nUsage:\nperl $0 input_file output_file\n";
die $usage unless @ARGV == 2;
open GO,'<',"$ARGV[0]" || die $usage;
open OUT,'>',"$ARGV[1]" || die $usage;
while(<GO>){
next if /^\s+$/; #为什么要位于"chomp;"行前呢?
chomp;
my ($seqid,$goid) = split /\t/,$_;
#print "$seqid\n";
#print "$goid\n";
my @goid = split /,/,$goid;
while (<@goid>){ #非空为真,空为假;while为循环,if不是循环。
my $one_goid = shift @goid; #注意理解此时$one_goid 与@goid内容。
print OUT "$seqid\t$one_goid\n";
}
}
close GO;
close OUT;
使用TBtools实现go2term
打开TBtools的GO Term Parse
功能
![](https://img.haomeiwen.com/i19940278/967e7fc13fd5adf1.png)
![](https://img.haomeiwen.com/i19940278/75cfac3a7325789c.png)
结果文件如下:
两个结果文件内容相同,就是列的位置不同。如果结果文件过大,excel可能无法直接打开,可以使用vscode
或者TBtools
的Big File Previewer
功能打开。
![](https://img.haomeiwen.com/i19940278/50d9433cf888829b.png)
其中结果文件one_per_line.txt.Parsed.Gene2Go.xls
部分内容如下
![](https://img.haomeiwen.com/i19940278/ad08bda3e7710c7e.png)
总结
- 代码的理解上
next if /^\s+$/; #为什么要位于chomp;行前呢?
chomp;
代码第16行的匹配理解还是不够,暂时不是很明白为什么第16、17行不能调换位置。
- while是循环,但if不是。循环在@goid中取值时第一次写成了if。
网友评论