从格式化输出perl

时间:2016-12-08 12:02:15

标签: perl

我有一个像这样的输入和列表文件:

input.txt文件:

>gi|NP_415931.4
MTEQQKLTFTALQQRLDSLMLRDRLRFSRRLHGVKKVKNPDAQQAIFQEMAKEIDQAAGKVLLREAARPEITYPD
>gi|NP_418770.2
MMNKSNFEFLKGVNDFTYAIACAAENNYPDDPNTTLIKMRMFGEATAKHLGLL
>gi|YP_026226.4
MRKFTLNIFTLSLGLAVMPMVEAAPTAQQQLLEQVRLGEATHREDLVQQSLYRLELIDPNNPDVVAARFRSLLRQGDIDGAQKQ

list.txt文件:

NP_415931.4: 1-5, 6-8
YP_026226.4: 3-7, 9-9, 10, 12-15

现在,我想要一个csv格式的output.csv(带有一些添加的标题)作为(对于上面的输入):

ID,Regions,Length,Sequences
NP_415931.4,1-5,5,MTEQQ
,6-8,3,KLT
YP_026226.4,3-7,5,KFTLN
,9-9,1,F
,10,1,T
,12-15,4,SLGL

也就是说,它首先将列表文件头与输入文件头匹配,然后匹配一次的序列,然后以上述格式排列输出。

output.csv的excel视图将是:

enter image description here

如何从这些输入生成上述output.csv文件?

由于

1 个答案:

答案 0 :(得分:1)

这是一种方法。总结一下:我们有一个包含所有已定义序列的主数据库文件input.txt。我们的工作是从该数据库中提取某些信息并将其写入CSV文件。有关提取内容的信息在文件list.txt中提供。

use feature qw(say);
use strict;
use warnings;

my $input_fn = 'input.txt';
open ( my $fh1, '<', $input_fn ) or die "Could not open file '$input_fn': $!";
my %seqs;
while( my $line = <$fh1> ) {
    my ($id ) = $line =~ /gi\|(.*)$/;
    chomp( my $seq = <$fh1> );
    $seqs{$id} = $seq;
}
close $fh1;
say join ',', qw(ID Regions Length Sequences);

my $list_fn = 'list.txt';
open ( my $fh2, '<', $list_fn ) or die "Could not open file '$list_fn': $!";
while( my $line = <$fh2> ) {
    chomp $line;
    my ( $id, @regions ) = split /[:,]\s?/, $line;
    for my $i (0..$#regions) {
        my $region = $regions[$i];
        my $start = my $end = $region;
        if ( $region =~ /(\d+)-(\d+)/ ) {
            $start = $1;
            $end = $2;
        }
        my $name = ($i == 0) ? $id : "";
        my $seq = substr( $seqs{$id}, $start - 1, $end - $start + 1);
        say join ',', $name, $region, length( $seq ), $seq;
    }
}
close $fh2;

<强>输出

ID,Regions,Length,Sequences
NP_415931.4,1-5,5,MTEQQ
,6-8,3,KLT
YP_026226.4,3-7,5,KFTLN
,9-9,1,F
,10,1,T
,12-15,4,SLGL