-4

我有一个包含一些数据的文本文件。因为我不是一个好的程序员,所以我无法解决我的问题。文本文件类似于:

00000001 ggccgccggcggtatcatggcgacccggaacccccctccccaag 00000044
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44121210 ggccgccggcggtatcatggcgacccggaacccccctccccaag 44121167

00000045 actatgaaagtgatgatgactcttacgaagtgttggatttaactgagtat 00000094
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44120443 actatgaaagtgatgatgactcttacgaagtgttggatttaactgagtat 44120394

00000095 gccagaagacaccactggtggaatcgagtgtttggccacagttccggacc 00000144
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44120393 gccagaagacaccactggtggaatcgagtgtttggccacagttccggacc 44120344

00000145 tatggtagaaaaatactcagtggccacccagattgtaatgggtggagtga 00000194
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44120343 tatggtagaaaaatactcagtggccacccagattgtaatgggtggagtga 44120294

00000195 gtggctg 00000201
<<<<<<<< ||||||| <<<<<<<<
44120293 gtggctg 44120287

00000202 gtgtgcaggatttttgttccagaaagttggaaaacttgcagcaactgcag 00000251
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44116963 gtgtgcaggatttttgttccagaaagttggaaaacttgcagcaactgcag 44116914

00000252 taggtggtggctttcttcttcttcag 00000277
<<<<<<<< |||||||||||||||||||||||||| <<<<<<<<
44116913 taggtggtggctttcttcttcttcag 44116888

00000278 atcgccagtcacagtggctatgtgcagatcgactggaagagagttgaaaa 00000327
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44113328 atcgccagtcacagtggctatgtgcagatcgactggaagagagttgaaaa 44113279

00000328 agatgtaaacaaagcaaaaagacagattaagaaacgagcaaataaggcag 00000377
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44113278 agatgtaaacaaagcaaaaagacagattaagaaacgagcaaataaggcag 44113229

00000378 cacctgaaatcaacaacataattgaagaa 00000406
<<<<<<<< ||||||||||||||||||||||||||||| <<<<<<<<
44113228 cacctgaaatcaacaacataattgaagaa 44113200

00000407 gcaacagaatttgtcaaacagaacattgtcatatccagtggatttgtggg 00000456
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44111361 gcaacagaatttgtcaaacagaacattgtcatatccagtggatttgtggg 44111312

00000457 aggctttttgctaggccttgcatcttaaggatatgaatgatctatcccag 00000506
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44111311 aggctttttgctaggccttgcatcttaaggatatgaatgatctatcccag 44111262

这是一个 blat 输出文件。

我想要的是把对应的值分配给下面的行值到上面的行值,如下所示:

00000001- 44121210
00000002- 44121211
00000003- 44121212
00000004- 44121213
-
-
-
00000506- 44111262.
4

4 回答 4

0

尝试:

#!/usr/bin/env perl

use strict;
use warnings;

# --------------------------------------

use English   qw( -no_match_vars );  # Avoids regex performance penalty

# --------------------------------------

# saved data to be sorted
my %data = ();

# isolate the localization of $INPUT_RECORD_SEPARATOR
{
  # paragraphs separated by a blank line
  local $INPUT_RECORD_SEPARATOR = "\n\n";

  # read a paragraph
  while( my $paragraph = <DATA> ){

    # break the paragraph into lines
    my @lines = split /\n/, $paragraph;

    # key is the first integer of the first line
    my ( $key ) = $lines[0] =~ m{ \A (\d+) }msx;

    # value is the first integer of the 3rd line
    my ( $value ) = $lines[2] =~ m{ \A (\d+) }msx;

    # save the data
    $data{$key} = $value;

  } # end while DATA
} # end isolation block

# output the data sorted by keys
for my $key ( sort { $a <=> $b } keys %data ){
  print "$key- $data{$key}\n";
}


__DATA__
00000001 ggccgccggcggtatcatggcgacccggaacccccctccccaag 00000044
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44121210 ggccgccggcggtatcatggcgacccggaacccccctccccaag 44121167

00000045 actatgaaagtgatgatgactcttacgaagtgttggatttaactgagtat 00000094
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44120443 actatgaaagtgatgatgactcttacgaagtgttggatttaactgagtat 44120394

00000095 gccagaagacaccactggtggaatcgagtgtttggccacagttccggacc 00000144
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44120393 gccagaagacaccactggtggaatcgagtgtttggccacagttccggacc 44120344

00000145 tatggtagaaaaatactcagtggccacccagattgtaatgggtggagtga 00000194
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44120343 tatggtagaaaaatactcagtggccacccagattgtaatgggtggagtga 44120294

00000195 gtggctg 00000201
<<<<<<<< ||||||| <<<<<<<<
44120293 gtggctg 44120287

00000202 gtgtgcaggatttttgttccagaaagttggaaaacttgcagcaactgcag 00000251
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44116963 gtgtgcaggatttttgttccagaaagttggaaaacttgcagcaactgcag 44116914

00000252 taggtggtggctttcttcttcttcag 00000277
<<<<<<<< |||||||||||||||||||||||||| <<<<<<<<
44116913 taggtggtggctttcttcttcttcag 44116888

00000278 atcgccagtcacagtggctatgtgcagatcgactggaagagagttgaaaa 00000327
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44113328 atcgccagtcacagtggctatgtgcagatcgactggaagagagttgaaaa 44113279

00000328 agatgtaaacaaagcaaaaagacagattaagaaacgagcaaataaggcag 00000377
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44113278 agatgtaaacaaagcaaaaagacagattaagaaacgagcaaataaggcag 44113229

00000378 cacctgaaatcaacaacataattgaagaa 00000406
<<<<<<<< ||||||||||||||||||||||||||||| <<<<<<<<
44113228 cacctgaaatcaacaacataattgaagaa 44113200

00000407 gcaacagaatttgtcaaacagaacattgtcatatccagtggatttgtggg 00000456
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44111361 gcaacagaatttgtcaaacagaacattgtcatatccagtggatttgtggg 44111312

00000457 aggctttttgctaggccttgcatcttaaggatatgaatgatctatcccag 00000506
<<<<<<<< |||||||||||||||||||||||||||||||||||||||||||||||||| <<<<<<<<
44111311 aggctttttgctaggccttgcatcttaaggatatgaatgatctatcccag 44111262
于 2013-07-27T13:16:54.023 回答
0

我会假设00000002示例输入中没有出现的原因是因为不完整,而且未排序。

(我确实读过你写的:

序列本身就是数字。ooooooo1 是 g,后面的 g 是 00000002

但对不起,我没看懂那个解释)

因此,如果我理解它/猜对了,你想取这些行,取块第一行的第一个数字(如00000001)并将它与块第三行的第一个数字连接起来(在那个块中,它会是44121210)。而且你想对它们进行排序。

#!/usr/bin/perl -w
# sortdna.pl

my $string = join('', <>);
my @processed = map { 
   my @l = split /\n/;
   $l[0] =~ s/\s.*$//;
   $l[2] =~ s/\s.*$//;
   $l[0] . "-" . $l[2]
} split(/\n\s*\n/, $string);
print join "\n", sort { $a cmp $b } @processed;

你像这样使用它:perl sortdna.pl < dna.txt

我使用您的示例输入得到的输出是:

00000001-44121210
00000045-44120443
00000095-44120393
00000145-44120343
00000195-44120293
00000202-44116963
00000252-44116913
00000278-44113328
00000328-44113278
00000378-44113228
00000407-44111361
00000457-44111311

...我知道我可能XD 还很远。请解释一下你到底需要什么,我会编辑它;)

于 2013-07-27T07:48:20.600 回答
0

给定您的数据文件(名称input.blat)和以下脚本:

unblat.pl

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

while (<>)
{
    chomp;
    next if m/^$/;
    my $line1 = $_;
    my $junk  = <>;
    my $line2 = <>;
    next unless $junk =~ m/^[<]+ [|]+ [<]+$/;
    $line1 =~ s/ .*//;
    $line2 =~ s/ .*//;
    printf "%.8d - %.8d\n", $line1, $line2;
}

输出

$ perl unblat.pl input.blat
00000001 - 44121210
00000045 - 44120443
00000095 - 44120393
00000145 - 44120343
00000195 - 44120293
00000202 - 44116963
00000252 - 44116913
00000278 - 44113328
00000328 - 44113278
00000378 - 44113228
00000407 - 44111361
00000457 - 44111311
$

如果这不是您想要的,那么您必须从给定数据中显示您想要的内容,而不是让我们推测给定数据的正确输出是什么。

于 2013-07-27T19:05:40.927 回答
0

我想我知道你想要什么:

perl -F'\s' -anE'BEGIN{$/="\n\n";}$i=$F[6];say"$_ - ",$i--for($F[0]..$F[2])'

很简单,不是吗?

顺便说一句,您的示例输出是错误的。我看到镜像(副本)的图像。左值大于右值。所以第二列中的值应该下降。如果您的输入数据可能会有所不同,则您必须使用更长的解决方案。

perl -F'\s' -anE'BEGIN{$/="\n\n";}$i=$F[6];say"$_ - ",$i<$F[8]?$i++:$i--for($F[0]..$F[2])'

有正常的脚本版本:

use strict;
use warnings;

$/ = '\n\n';
$\ = '\n';

while (<>) {
    my ( $f, $t, $i, $j ) = ( split ' ' )[ 0, 2, 6, 8 ];
    print "$_ - ", $i < $j ? $i++ : $i-- for ( $f .. $t );
}

编辑

这个怎么运作?$/ = '\n\n';将阅读切换到段落模式。(“行”由行的两端分隔。)$\ = '\n';在每次print调用后添加行尾。使用say而不是print会做同样的事情,但你必须使用use feature 'say';-E切换。split ' '-F'\s'按包含行尾的白色字符拆分读取的段落。(注' '在调用中具有特殊含义split。)然后它使用第 1、3、7 和 9 个“单词”(索引 0、2、6、8)来确定应该打印哪些坐标。$f .. $t生成原始坐标并且$i是图像坐标的起点。$i < $j选择图像坐标的方向并$i < $j ? $i++ : $i--生成它们。后缀for如何遍历生成的原始坐标是非常 Perl 惯用的方式。

于 2013-07-27T17:44:06.037 回答