如何提取文本文件中的部分行并将其打印到Perl中的输出文件(代码半写)

时间:2012-10-17 21:29:41

标签: perl

我有一个很大的.txt文件,其中一部分显示如下 -

ID   SNP
FT   SNP             102
FT                   /note="refAllele: C SNPstrains: 4395_8_10=A 4395_8_7=A 4395_8_9=A     "
FT                   /colour=1
FT   SNP             1299
FT                   /note="refAllele: A SNPstrains: 6437_8_6=T (non-synonymous) (AA Gin->His) "
FT                   /colour=2
FT   SNP             2134
FT                   /note="refAllele: C SNPstrains: 4395_8_12=T "
FT                   /colour=1
FT   SNP             3205
FT                   /note="refAllele: C SNPstrains: 6437_8_12=T (synonymous) "

我也有这个脚本(我没写过) -

$cod{1} = "Int";
$cod{2} = "non";
$cod{3} = "syn";
$cod{4} = "stop";

$file = "Whole.pl";
open IN, "$file";
open OUT, ">whole2";
print OUT "Coordinate   Type    Strains\n";

while (<IN>) {

    if (m/^FT\s+SNP\s+(\d+)/) {

        $SNP = $1;      
    }
    elsif (m/^FT\s+\/note="(.*)"/) {

        $line = $1;
        $count = ($line =~ tr/=/=/);
    }
    elsif (m/^FT\s+\/colour=(\d+)/) {

        if ($cod{$1}) {

            print OUT "$SNP $cod{$1} $count\n";
        }
        elsif (!$cod{$1}) {

            print OUT "$SNP colour $1 $count\n";
        }
    }
}    

它会创建一个新文件。对于上述数据,它会创建 -

Coordinate  Type    Strains 
102          Int    3
1299         non    1
2134         Int    1
3205         syn    1

我对perl和编程很新,并且认为我只是理解这个脚本正在做什么。然而,对于显示非同义突变的菌株(例如.txt文件中的第二个),我想在输出文件中具有第四列,其详述氨基酸变化(例如(AA Gin->他的),.txt文件中第六行的结尾)。另外,我最好只想在输出中显示非同义突变,并完全保留“syn”和“int”。

我已经尝试了很多方法来做到这一点但没有一个有效。请问您能告诉我一种方法吗?

非常感谢提前。

最高

1 个答案:

答案 0 :(得分:0)

假设:

  1. 您的/note可能含有氨基酸变化作为最后一个元素。它必须用parens括起来,并以字母AA开头,后跟一个或多个字母的序列,然后是->,然后是另一个一个或多个字母的序列。

    < / LI>
  2. 您只对non类型感兴趣。

  3. 在您的第一个elsif中,我们必须将$line与可能的氨基酸变化相匹配:

    }elsif(m/^FT\s+\/note="(.*)"/){
            $line=$1;
            $line =~ m/\((AA \w+->\w+)\)\s*$/;
            $change = $1 || "";
            ...;
    

    在您的第二个elsif中,我们仅在$cod{$1}等于non时打印:

    }elsif(m/^FT\s+\/colour=(\d+)/){
       print OUT "$SNP $count $change\n" if $cod{$1} eq "non";
       # inner if/else not needed any longer.
    }
    

    此外,顶部的表格标题必须更改:

    print OUT "Coordinate   Strains Change\n";
    

    您必须手动重新对齐列。

    这会打印类似

    的内容
    Coordinate      Strains Change
    1299    1       AA Gin->His
    

    关于示例输入。