【问题标题】:Manipulating files according to indexes by perlperl根据索引操作文件
【发布时间】:2012-02-22 16:43:23
【问题描述】:

我正在处理一些基因组数据,我有 2 个文件 ->

文件1

A1 1 10
A1 15 20
A2 2 11
A2 13 16

文件2

>A1 CTATTATTTATCGCACCTACGTTCAATATACAGGCGAACATACCCACTA AAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATAACAATTGAAT >A2 GTCTGCACAGCCGCTTTCCACACAGACATAACAAAAAATTTCCACCA AACCCCCCCCTCCCCCCGCTTCTGGCCACAGCACTTAAACACATCTCTGC CAAACCCCAAAAAAAAAAGAACCCTAACACCAGCCTAACCAGATTTCAAAT

在文件 1 中,第 2 和第 3 列表示 File2 中的索引。所以我想要这样,如果 file1 的 column1 中的字符与 file2 中的字符后跟符号 (>) 匹配,那么从该 file2 的下一行根据 file1 的 col2 和 col3 中的索引返回子字符串。 (对不起,我知道它很复杂)这是欲望输出 ->

输出

>A1#1:10 塔塔塔塔 >A1#15:20 ACCTA >A2#2:11 TCTGCACAGC >A2#13:16 GCTT

我知道如果我只有 1 个字符串,我可以很容易地取出子字符串 ->

@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 中的字符(后跟 > 符号)匹配,然后如何获取子字符串?

【问题讨论】:

    标签: perl


    【解决方案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;
    }
    

    【讨论】:

    • 非常感谢您的回复。您能否告诉我您所说的内容->它们都是一条连续的线或单独的线。如果我错过了什么,我可以澄清一下。
    • 第二个文件中的测试数据 - DNA 序列,似乎分布在多行而不是一个长序列。这没关系,无论哪种方式都可以。除非它们被视为每种类型的单独项目(即 A1 有 2 行,A2 有 3 行)。我目前连接了这些行,因此 A1 和 A2 有一个长的连续字母串。如果它们需要独立,则需要对循环进行细微调整。
    • 两个子程序都调用 read_file 子程序,它通过删除空行、换行符以及前导和尾随空格来准备文件。这是确保您的数据良好所必需的。它将内容加载到数组@lines 中,它们都对其进行迭代。在 read_index 中,每一行都由空格(制表符和/或空格)分割,然后存储到数组哈希 (HoA) 中。从每一行中提取键、开始和停止值,开始和停止被放置到一个匿名数组 [$start,$stop] 中,每个组都被添加到该键列表中。 $hash{A1}-&gt;[[10,15],[15,20]]
    • 可以像$hash{A1}-&gt;[0][0] = 10, $hash{A1}-&gt;[0][1] = 15一样访问。 read_master 非常相似,但是它将每一行的文本连接起来,直到检测到下一个“>键”。 $h{A1} = "row1"."row2"。这使得查找该键的文本变得容易。如果您有任何其他问题,请告诉我。希望对您有所帮助。
    • @m0skit0,我倾向于不同意。我从 1983 年就开始编程,那时,如果代码不在杂志上,我想我永远不会学习 Basic(大约 8 种不同的风格)、Assembler(PC、IBM、DG)、COBOL、Pascal、 C、C++、Perl、TCL、Python、Kornshell 等等。通过示例进行编码有助于学习,尤其是对于更高级的主题。我通常会复制对我来说新的代码,然后进行试验、破坏它,然后学习如何修复它。提出正确的问题,您就成功了。
    【解决方案2】:

    在哈希中加载 File2,以 A1、A2... 作为键,以 DNA 序列作为值。这样您就可以轻松获得 DNA 序列。

    【讨论】:

    • 感谢您的回复。但是在file2中,我不知道有多少个A1,A2...An(以及它们存在于哪一行),我只知道它们后面跟着符号'>'。我应该如何将所有 A1 等作为键和所有 DNA 序列作为值?
    • 是的,我就是这个意思。您不需要知道有多少,而是如何识别它们。如果是不均匀的行 -> 键,甚至行 -> 序列,这很容易。您还需要从键中删除前导 ">",这可以使用 /^&gt;(\w+)/ 轻松完成,并从此正则表达式中获取 $1
    【解决方案3】:

    第二次更新也将主文件转换为数组哈希。

    这会将第二个文件中的每一行视为单独的序列。

    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
    

    【讨论】:

      猜你喜欢
      • 2020-04-09
      • 2012-05-29
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 2015-12-20
      • 2012-06-22
      相关资源
      最近更新 更多