Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中读取文件并以特定格式输出_Perl - Fatal编程技术网

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

在Perl中读取文件并以特定格式输出,perl,Perl,我有一个包含一些数据的文本文件。因为我不是一个好的程序员,所以我不能解决我的问题。文本文件类似于: 00000001 ggccgccggcggtatcatggcgacccggaacccccctccccaag 00000044 <<<<<<<< |||||||||||||||||||||||||||||||||||||||||||| <<<<<<<< 44121210 ggccgccggcggtatca

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

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

我假设00000002没有出现在示例输入中的原因是因为它不完整,也没有排序

我确实读过你写的:

序列本身就是数字。oo1是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;
…我知道我可能离XD太远了。请解释一下你到底需要什么,我会编辑它

试试看:

#!/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

我想我知道你想要什么:

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′;在每次打印调用后添加行尾。使用say而不是print将做同样的事情,但您必须使用特性“say”;或-E开关。拆分“”或-F'\s'将读取的段落拆分为包含行尾的白色字符。注意“”在拆分调用中具有特殊意义。然后使用第1、第3、第7和第9个单词索引0、2、6、8来确定应该打印哪些坐标$f$t生成原始坐标,$i是图像坐标的起点$i<$j选择图像坐标的方向,$i<$j$i++:$i-只生成它们。后缀for是一种非常地道的Perl方法,可以通过生成的原始坐标进行迭代。

给定数据文件名input.blat和以下脚本:

unblat.pl
如果这不是你想要的,那么你必须展示你想要从给定数据中得到什么,而不是让我们去推测给定数据的正确输出。

g,c,t,a,很好奇,这是DNA吗?欢迎来到Stack Overflow。请尽快阅读这一页。数字0000000 2未出现在示例输入中;它是如何出现在示例输出中的?数字44121211没有出现在样本输入中;它是如何出现在示例输出中的?更一般地说,您所展示的示例输入的预期输出是什么?您的样本输出与输入没有足够的相似性,我们不知道该怎么做。而且更一般地说,,你尝试过什么?对不起,我只是个新手。发生的事情是序列本身就是数字。OOOOOO1是g,后面的g是0000000 2是的,YU Hao这是dna序列,这是样本blat输出请显示你从显示的输入中预期的输出-而不是从其他数据集中预期的输出,或更完整形式的输入数据。谢谢。但我的观点是00000001到00000457是序列GGCCGCGCGGTATCGGCGACCCGGACCCCTCCCAG中字母的位置,这些位置对应44121210到44121310个位置。我想用这种方式打印它们00000001-44121210 00000002-4412121100000003-44121213到00000457-441213100我在问题中显示了数据,我不知道生成506行的输出如何与包含12组输入的输入相对应。您的第一行输出对应于我答案中的第一行输出,以及问题中的第一行输出。此后,对于输出应该是什么,至少有3种不同的观点。@JonathanLeffler输入是DNA,数字对应位置。在不同的地方发现了序列。第一行是原始的,第三行是图像。每行对应一个胺酸,左栏为原始位置,第二栏为其副本。输入中有506个氨基酸,所以输出中有506行。在OP澄清需要什么之前,我们必须同意对数据的解释存在分歧。我不能说我是对的,你是错的,反之亦然。其他两个答案产生的输出与我的相同,但多数投票在这种情况下不起作用。这给出了:在-e行1处运算符预期的位置找到反斜杠,靠近-e行1处的n\语法错误,near n \BEGIN not safe errors编译在-e第1行中止。@Hynek-Pichi-Vychodil@dhaliwal我的代码中没有任何n\项。我已经使用了复制粘贴和两个一行,都是预期的工作。使用复制粘贴。如果您没有Perl黑客的经验,请不要尝试手工编写 显示两个序列对齐的输出文件。第一行是第一个序列,第三行是第二个序列。数字00000001等是序列ggc…中字符的位置,第三行也是如此。所需输出为:00000001-44121210 00000000 2-441212110000000 3-4412121200000504-44111264 00000505-44111263 00000506-44111262
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 );
}
#!/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
$