我有两个文件: 文件1:
84C2_Locus_14_Transcript_1/3_Confidence_0.571_Length_1244
AAACTAGTCAATAGAGAAAATCCAAAGTGGATGAAATTGAAGTGATTGTATGGCACAAGT...so on
>84C2_Locus_14_Transcript_2/3_Confidence_0.857_Length_1961
AAACTAGTCAATAGAGAAAATCCAAAGTGGATGAAATTGAAGTGATTGTATGGCACAAGT...so on
>84C2|Locus_15_Transcript_1/9_Confidence_0.190_Length_757
ATTTGCTCGGAAAAACACTTCTCGTGGAACTTGTTAGCGCTGAGCTTGATCCCAAGACGA.....so on
>84C2_Locus_15_Transcript_5/9_Confidence_0.333_Length_1841
ATTTGCTCGGAAAAACACTTCTCGTGGAACTTGTTAGCGCTGAGCTTGATCCCAAGACGA....so on
File2:只有序列IDS
84C2_Locus_14_Transcript_1/3_Confidence_0.571_Length_1244
84C2_Locus_14_Transcript_2/3_Confidence_0.857_Length_1961
84C2_Locus_14_Transcript_3/3_Confidence_0.571_Length_1248
84C2_Locus_15_Transcript_1/9_Confidence_0.190_Length_757
...........很多。
我的输出文件应包含与标题关联的序列。即将序列id文件头部分与原始fasta序列文件匹配,并且那些序列头部与另一个包含带序列的头部的输出文件中的fasta序列头部存储匹配。就像这样:
原始输出文件应该是这样的:
>84C2_Locus_15_Transcript_5/9_Confidence_0.333_Length_1841
ATTTGCTCGGAAAAACACTTCTCGTGGAACTTGTTAGCGCTGAGCTTGATCCCAAGACGA......so on
请建议我使用perl的方式适用于我的问题。
答案 0 :(得分:0)
编辑:新代码,我第一次没有理解你的问题。此脚本读取两个文件,将所有ID存储在哈希中,然后遍历第一个文件中的所有序列。只有那些ID在第二个文件中的序列才会被写入输出文件。请注意,输出使用|
作为分隔符写入,就像在第一个文件中一样,而不是_
,就像第二个文件中的ID一样。第一个文件开头缺少的>
也可以正确复制。
#!/usr/bin/perl -w
use strict;
# Check command line arguments
unless ($#ARGV == 1 && -e $ARGV[0] && -e $ARGV[1]) {
print STDERR "Usage: split-fasta.pl DATA IDS\n";
exit 1;
}
my (%ids, $id);
# Read sequence IDs
open(IDS, "<$ARGV[1]") or die "Can't open IDs file: $1";
while (<IDS>) {
$ids{$_} = 1;
}
close(IDS);
# Read sequence data and write results to output.fasta
open(DATA, "<$ARGV[0]") or die "Can't open sequences file: $1";
open(OUTFILE, ">>output.fasta") or die "Can't open output file: $1";
while (<DATA>) {
my $line = $_;
if ($line =~ /^>?(\w+\|.+\n)/) {
$id = $1;
$id =~ tr/|/_/;
}
print OUTFILE $line if defined $ids{$id};
}
close(DATA);
close(OUTFILE);
那么,你基本上想要将文件1分成多个文件,每个文件只包含一个序列?也许这个丑陋的(可能关闭每个文件句柄,而不仅仅是最后一个...)Perl的一块将帮助你。
#!/usr/bin/perl -w
use strict;
while (<>) {
my $line = $_;
if ($line =~ />?([0-9]+|\w+)\//) {
my $file_name = $1;
open(OUTFILE, ">>$file_name");
}
print OUTFILE $line;
}
close(OUTFILE);
编辑:如果您想从第二个文件中输入ID,只需添加与ID匹配的另一个 if
和第一个文件中的标头文件。只要两个文件的顺序相同,这应该有效,因为输入在写入时立即被丢弃,不能再被搜索。