在Perl中以特定格式读取文件和输出

时间:2013-07-27 06:50:38

标签: perl

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

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.

3 个答案:

答案 0 :(得分: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。请解释一下你需要什么,我会编辑它;)

答案 1 :(得分: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

答案 2 :(得分: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
$

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