我正在处理一些基因组数据,我有2个文件 - >
File1中
A1 1 10 A1 15 20 A2 2 11 A2 13 16
文件2
>A1 CTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACCTACTA AAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATAACAATTGAAT >A2 GTCTGCACAGCCGCTTTCCACACAGACATCATAACAAAAAATTTCCACCA AACCCCCCCCTCCCCCCGCTTCTGGCCACAGCACTTAAACACATCTCTGC CAAACCCCAAAAACAAAGAACCCTAACACCAGCCTAACCAGATTTCAAAT
在文件1中,第2和第3列表示File2中的索引。所以我想要的是,如果file1的column1中的字符与file2中的符号(>)匹配,那么从该file2的下一行根据file2的col2和col3中的索引返回子字符串。 (对不起,我知道它很复杂)这是欲望输出 - >
输出
>A1#1:10 CTATTATTTA >A1#15:20 ACCTA >A2#2:11 TCTGCACAGC >A2#13:16 GCTT
我知道如果我只有一个字符串,我可以很容易地取出子字符串 - >
@ARGV or die "No input file specified";
open $first, '<',$ARGV[0] or die "Unable to open input file: $!";
$string="GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCAT";
while (<$first>)
{
@cols = split /\s+/;
$co=$cols[1]-1;
$length=$cols[2]-$co;
$fragment = substr $string, $co, $length;
print ">",$cols[0],"#",$cols[1],":",$cols[2],"\n",$fragment,"\n";
}
但是我的问题是我应该何时输入我的第二个文件,我应该如何匹配col1(file1)中的字符与file2中的字符(后跟&gt;符号)以及如何获取子字符串?
答案 0 :(得分:1)
在Hash中加载File2,其中A1,A2 ...作为键,DNA序列作为值。这样您就可以轻松获得DNA序列。
答案 1 :(得分:1)
我不确定它们是否是一条连续线或单独的线。 我现在把它设置为连续的。
基本上,将第二个文件作为主文件读取。 然后,您可以根据需要处理任意数量的索引文件。
您可以使用数组哈希来帮助编制索引。 推@ {$ index {$ key}},[$ start,$ stop];
use strict;
my $master_file = "dna_master.txt";
if ($#ARGV) {
print "Usage: $0 [filename(s)]\n";
exit 1;
}
my %Data = read_master($master_file);
foreach my $index_file (@ARGV) {
my %Index = read_index($index_file);
foreach my $key (sort keys %Index) {
foreach my $i (@{$Index{$key}}) {
my ($start,$stop) = @$i;
print ">$key#$start:$stop\n";
my $pos = $start - 1;
my $count = $stop - $start + 1;
print substr($Data{$key},$pos,$count)."\n";
}
}
}
sub read_file {
my $file = shift;
my @lines;
open(FILE, $file) or die "Error: cannot open $file\n$!";
while(<FILE>){
chomp; #remove newline
s/(^\s+|\s+$)//g; # strip lead/trail whitespace
next if /^$/; # skip blanks
push @lines, $_;
}
close FILE;
return @lines;
}
sub read_index {
my $file = shift;
my @lines = read_file($file);
my %index;
foreach (@lines) {
my ($key,$start,$stop) = split /\s+/;
push @{$index{$key}}, [$start,$stop];
}
return %index;
}
sub read_master {
my $file = shift;
my %master;
my $key;
my @lines = read_file($file);
foreach (@lines) {
if ( m{^>(\w+)} ) { $key = $1 }
else { $master{$key} .= $_ }
}
return %master;
}
答案 2 :(得分:1)
第二次更新也将主文件转换为数组哈希值。
这会将第二个文件中的每一行视为单个序列。
use strict;
my $master_file = "dna_master.txt";
if ($#ARGV) {
print "Usage: $0 [filename(s)]\n";
exit 1;
}
my %Data = read_master($master_file);
foreach my $index_file (@ARGV) {
my %Index = read_index($index_file);
foreach my $key (sort keys %Index) {
foreach my $i (@{$Index{$key}}) {
my ($start,$stop) = @$i;
print ">$key#$start:$stop\n";
my $pos = $start - 1;
my $count = $stop - $start + 1;
foreach my $seq (@{$Data{$key}}) {
print substr($seq,$pos,$count)."\n";
}
}
}
}
sub read_file {
my $file = shift;
my @lines;
open(FILE, $file) or die "Error: cannot open $file\n$!";
while(<FILE>){
chomp; #remove newline
s/(^\s+|\s+$)//g; # strip lead/trail whitespace
next if /^$/; # skip blanks
push @lines, $_;
}
close FILE;
return @lines;
}
sub read_index {
my $file = shift;
my @lines = read_file($file);
my %index;
foreach (@lines) {
my ($key,$start,$stop) = split /\s+/;
push @{$index{$key}}, [$start,$stop];
}
return %index;
}
sub read_master {
my $file = shift;
my %master;
my $key;
my @lines = read_file($file);
foreach (@lines) {
if ( m{^>(\w+)} ) { $key = $1 }
else { push @{ $master{$key} }, $_ }
}
return %master;
}
输出:
>A1#1:10
CTATTATTTA
AAGTGTGTTA
>A1#15:20
ACCTAC
ATTAAT
>A2#2:11
TCTGCACAGC
ACCCCCCCCT
AAACCCCAAA
>A2#13:16
GCTT
CCCC
ACAA