首先介绍fastq的格式和fasta的格式:
fastq是测序所得的文件,其内部含有对每一个碱基进行质量评估的值:
第一行:测序的index;
第二行:该index下测出的序列信息;
第三行:+;
第四行:对第二行每个碱基进行一个质量评估,一个碱基对应一个字母;
fasta是默认序列的存储的文件:
示例文件为小鼠参考基因组对应的转录组文件。
包括两部分内容:
第一部分:基因的index
第二部分:基因的序列
其次,在转化前,我们需要比较两个文件格式的异同,涉及转换思路:
1、将fastq文件中index中的@转化为>;
2、将fastq文件中的第三行和第四行删除;
接着我们开始转化,秉着处理数据的大小越来越小的原则
我们首先进行2(将fastq文件中的第三行和第四行删除),利用的是perl语言中正则表达式的思路,查找和复写:
#! C:\other_disk\D_disk_software\perl64 -w
use utf8;
binmode(STDOUT,":utf8");
open(FH, "<F_NC_1_1.clean.fq") or die "file cannot open, $!";
open(FH2, ">F_NC_1_1_shit.txt") or die "file cannot open, $!";
while(<FH>){
if(/@/ or /A/ or /T/ or /C/ or /G/){
print FH2 $_;
}else{
next;
}
}
close FH;
close FH2;
执行完以上代码,我们将目标数据转化为:
我们接着进行1(将fastq文件中index中的@转化为>),利用的是perl语言中正则表达式的思路,查找和替换:
#! C:\other_disk\D_disk_software\perl64 -w
use utf8;
binmode(STDOUT,":utf8");
open(FH2, "<F_NC_1_1_shit.txt") or die "file cannot open, $!";
open(FH3, ">F_NC_1_1_replace.txt") or die "file cannot open, $!";
while(<FH2>){
if(s/@/>/g){
print FH3 $_;
}else{
print FH3 $_;
}
}
close FH2;
close FH3;
执行完以上代码,我们将目标数据转化为:
那我们能否将以上代码合并,一步就完成格式的转化呢?
当然可以,上代码:
#! C:\other_disk\D_disk_software\perl64 -w
use utf8;
binmode(STDOUT,":utf8");
open (FH1, "<F_NC_1_1_shit.txt") or die "file cannot open, $!";
open (FH2, ">F_NC_1_1_replace.txt") or die "file cannot open, $!";
while(<FH1>){
if(/@/ or /A/ or /T/ or /C/ or /G/){
if(s/@/>/g){
print FH2 $_;
}else{
print FH2 $_;
}
}else{
next;
}
}
close FH1;
close FH2;
假如我们有多个文件需要格式转化,那该如何进行处理呢?
因为这个文件的转化是为了进行后续的blast,因此,我将数据上传到了超算中,进行批量的转化。因此,perl语言的脚本的第一行进行了调整、文件的绝对路径也进行了指定。同时也加入了新的代码。
#!/public1/home/scb4951/miniconda3/bin/perl -w
use utf8;
binmode(STDOUT,":utf8");
while (my $file = glob "/public1/home/scb4951/data/Guizhen_oocyte_rna/all_clean/*.clean.fq" ){#将以上路径下的所有包含.clean.fq的文件名称依次传入到$file变量中。
print "$file\n";#可以删除,这个命令是为了验证该文件夹下是否有符合要求的文件。
my $file1 = $file.".sift";#命名转化之后的文件名,在原文件名后加入.sift
open (FH1, '<:utf8', $file) or die "file cannot open, $!";#将变量$file转化为输入文件的文件名。
open (FH2, '>:utf8', $file1) or die "file cannot open, $!";#将变量$file1转化为输出文件的文件名。
while(<FH1>){
if(/@/ or /A/ or /T/ or /C/ or /G/){
if(s/@/>/g){
print FH2 $_;
}else{
print FH2 $_;
}
}else{
next;
}
}
print $file."OK";
close FH1;
close FH2;
}