Perl 读取blat对齐文件并打印对齐中的所有位置

Perl 读取blat对齐文件并打印对齐中的所有位置,perl,Perl,大家好,我有一些来自blat工具的数据,它给出了对齐的输出,如下所示: contig30 chromosome 1 000000001 gctctgc.tctggggacgctcgcagcgctcggcgcctggcccag 000000043 >>>>>>>>> ||||||| |||||||||||||||||||||||||||||||||||| >>>>>>>>> 12336856

大家好,我有一些来自blat工具的数据,它给出了对齐的输出,如下所示:

contig30
chromosome 1
000000001 gctctgc.tctggggacgctcgcagcgctcggcgcctggcccag 000000043
>>>>>>>>> ||||||| |||||||||||||||||||||||||||||||||||| >>>>>>>>>
123368567 gctctgcatctggggacgctcgcagcgctcggcgcctggcccag 123368610

000000044 tttctttgacaatgtctaccgttcatgaaattctgtgcaagctcagcttg 000000093
>>>>>>>>> |||||||||||||||||||||||||||||||||||||||||||||||||| >>>>>>>>>
123380141 tttctttgacaatgtctaccgttcatgaaattctgtgcaagctcagcttg 123380190

contig35
chromosome 1
000000001 gctctgc.tctggggacgctcgcagcgctcggcgcctggcccag 000000043
>>>>>>>>> ||||||| |||||||||||||||||||||||||||||||||||| >>>>>>>>>
123368567 gctctgcatctggggacgctcgcagcgctcggcgcctggcccag 123368610
我有一个这个数据的文本文件

我要做的是按以下方式打印输出:

contig 30 chromosome 1 000000001-123368567
contig 30 chromosome 1 000000002-123368568
contig 30 chromosome 1 000000003-123368569

 -
 -
 upto
 contig 30 chromosome 1 000000093-123380190
下一个条目也是如此。
我的输入文本文件中有多个这种类型的条目。

请您查找以下内容:

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;

my $content = do {
    local $/;
    <DATA>
};

while (
    $content =~ /   
                        (contig)(30)\n
                        (chromosome\ 1)\n
                        (\d+).*\n
                        .*\n
                        (\d+).*\n

                    /gmx
  )
{
    print $1, " ", $2, " ", $3, " ", $4, "-", $5, "\n";
}

__DATA__
contig30
chromosome 1
000000001 gctctgc.tctggggacgctcgcagcgctcggcgcctggcccag 000000043
>>>>>>>>> ||||||| |||||||||||||||||||||||||||||||||||| >>>>>>>>>
123368567 gctctgcatctggggacgctcgcagcgctcggcgcctggcccag 123368610

000000044 tttctttgacaatgtctaccgttcatgaaattctgtgcaagctcagcttg 000000093
>>>>>>>>> |||||||||||||||||||||||||||||||||||||||||||||||||| >>>>>>>>>
123380141 tttctttgacaatgtctaccgttcatgaaattctgtgcaagctcagcttg 123380190

contig35
chromosome 1
000000001 gctctgc.tctggggacgctcgcagcgctcggcgcctggcccag 000000043
>>>>>>>>> ||||||| |||||||||||||||||||||||||||||||||||| >>>>>>>>>
123368567 gctctgcatctggggacgctcgcagcgctcggcgcctggcccag 123368610

contig30
chromosome 1
000000002 gctctgc.tctggggacgctcgcagcgctcggcgcctggcccag 000000043
>>>>>>>>> ||||||| |||||||||||||||||||||||||||||||||||| >>>>>>>>>
123368568 gctctgcatctggggacgctcgcagcgctcggcgcctggcccag 123368610
#/usr/bin/env perl
严格使用;
使用警告;
使用utf8;
我的$content=do{
本地$/;
};
当(
$content=~/
(挫伤)(30)\n
(染色体\1)\n
(\d+).*\n
.*\n
(\d+).*\n
/gmx
)
{
打印$1、$2、$3、$4、“-”、$5、“\n”;
}
__资料__
contig30
1号染色体
00000000 1 gctctgc.TCTGGGGACGCTCGCGCGCGCGGCCTGGCCCAG 0000000 43
>>>>>>>>> ||||||| |||||||||||||||||||||||||||||||||||| >>>>>>>>>
123368567 GCTCTGCATCTGGGGACGCTCGCGCTCGGCGCCTGGCCCAG 123368610
0000000 44 TTTCTTTGACATGTACGCTTCATGAATTCGTGCAAGCTCAGTTG 0000000 93
>>>>>>>>> |||||||||||||||||||||||||||||||||||||||||||||||||| >>>>>>>>>
123380141 TTTCTTTGACATGTACGCTTCATGAATTCGTGCAAGCTCAGTTG 123380190
contig35
1号染色体
00000000 1 gctctgc.TCTGGGGACGCTCGCGCGCGCGGCCTGGCCCAG 0000000 43
>>>>>>>>> ||||||| |||||||||||||||||||||||||||||||||||| >>>>>>>>>
123368567 GCTCTGCATCTGGGGACGCTCGCGCTCGGCGCCTGGCCCAG 123368610
contig30
1号染色体
00000000 2 gctctgc.TCTGGGGACGCTCGCGCGCGCGGCCTGGCCCAG 0000000 43
>>>>>>>>> ||||||| |||||||||||||||||||||||||||||||||||| >>>>>>>>>
123368568 GCTCTGCATCTGGGGACGCTCGCGCTCGGCGCCTGGCCCAG 123368610
这里重要的一点是,
数据
被混入
$content
。这意味着文件的全部内容都存储在
$content
中,包括所有换行符等。。为了


将文件镜像到变量中后,可以对其执行多行搜索。为了通知perl这样做,您必须将
m
修饰符添加到正则表达式中(添加x修饰符是为了通过描述模式的底层结构来提高正则表达式的易读性)。

这似乎完成了以下工作:

#!/usr/bin/env perl
use strict;
use warnings;

my $contig;
my $chromo;

while (<>)
{
    chomp;
    if (/^contig(\d+)/)
    {
        $contig = $1;
    }
    elsif (/^chromosome (\d+)/)
    {
        $chromo = $1;
    }
    elsif (/^(\d+) [acgt.]+ (\d+)/)
    {
        my $b1 = $1;
        my $e1 = $2;
        my $junk = <>;
        my $line = <>;
        next unless $junk =~ m/^[<>]+ [ |]+ [<>]+$/; # See other question
        my($b2, $e2) = $line =~ m/^(\d+) [acgt.]+ (\d+)/;
        for (my $i = 0; $i < $e1 - $b1; $i++)
        {
            printf "contig %d chromosome %d %.9d-%.9d\n", $contig, $chromo, $b1+$i, $b2+$i;
        }
    }
    # else blank?  Ignore it, anyway.
}

请显示您的代码,并描述您在使其正常工作时遇到的问题。这与相关。并由同一用户询问…请将
$/
本地
设置为未定义!谢谢你的提示!你是对的,最好限制修改后的
$/
:thanx的范围很多。它已经起作用了。但是它没有考虑到排列中的“.”。而且,如果在某个地方我们的染色体编号为X或M,它显示为0。请帮忙。thanx很多。同样,请解释一下这个脚本中发生了什么。您没有展示任何X或M的示例,也没有展示如何处理
。你不能指望人们猜到你藏在袖子里的是什么把戏!你需要自己解决这些问题。你没有为最后一个问题提供足够的信息;你没有为这个问题提供足够的信息。这里有一个很强的模式——一个你需要打破的模式。
contig 30 chromosome 1 000000001-123368567
contig 30 chromosome 1 000000002-123368568
contig 30 chromosome 1 000000003-123368569
...
contig 30 chromosome 1 000000040-123368606
contig 30 chromosome 1 000000041-123368607
contig 30 chromosome 1 000000042-123368608
contig 30 chromosome 1 000000044-123380141
contig 30 chromosome 1 000000045-123380142
contig 30 chromosome 1 000000046-123380143
...
contig 35 chromosome 1 000000001-123368567
contig 35 chromosome 1 000000002-123368568
contig 35 chromosome 1 000000003-123368569
...
contig 35 chromosome 1 000000040-123368606
contig 35 chromosome 1 000000041-123368607
contig 35 chromosome 1 000000042-123368608