【问题标题】:How to create an output file (re)writed?如何创建(重新)写入的输出文件?
【发布时间】:2019-10-13 07:00:34
【问题描述】:

我一直在尝试解决我的脚本,但我真的很感激一些帮助。 我有 2 个输入文件。

第一个是一个多 fasta 文件,其标题如下:

'>AH008024.2 Angelica acutiloba internal transcribed spacers 1 and 2, partial sequence'
'>AJ969149.1 Carthamus tinctorius partial ITS2'
....

(引号只是为了让 > 符号可见,否则不显示...)

第二个是底漆验证文件,如下所示:

AB280738.1,UniplantR,49,68,forward,CCCGHYTGAYYTGRGGTCDC,20,71.4,,,56.5 - 69.8
AB280739.1,UniplantR,49,68,forward,CCCGHYTGAYYTGRGGTCDC,20,71.4,,,56.5 - 69.8
AB280740.1,UniplantR,49,68,forward,CCCGHYTGAYYTGRGGTCDC,20,71.4,,,56.5 - 69.8
...

我想编写第二个文件的“重写”版本,从 fasta 文件中更改物种名称的登录号“AB280738.1”,生成一个制表符分隔的输出,如下所示:

AB280738.1      Glycyrrhiza uralensis ITS1, 5.8S rRNA and ITS2     UniplantR 49 68 forward CCCGHYTGAYYTGRGGTCDC 20 71.4   56.5 - 69.8

AB280739.1      Glycyrrhiza glabra ITS1, 5.8S rRNA and ITS2      UniplantR 49 68 forward CCCGHYTGAYYTGRGGTCDC 20 71.4   56.5 - 69.8     
...

最终输出的行数必须与第二个输入文件,primers 文件的行数相同,在本例中为 420 行,但我当前的输出是写 292140 行,它正在匹配,但不是写得好。

我一直在处理我向您展示的这段代码。 我看到我的脚本的“匹配”部分正在工作,但我认为我没有做正确的“推送”步骤。除此之外,还有一些事情使我的嵌套循环递归,因为同一匹配中有多行。 要知道它正在工作,输出必须具有与第二个输入(引物输入)相同的行数。 第二个“打印”告诉我 hou 模式匹配了很多次,它给了我 540 而不是 420。

如果有人想尝试使用它,我想上传我的输入文件和当前输出,但我找不到上传文件的位置..

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

   print "multifasta:\t";
   my $arq1 = <STDIN>;
   open (MYFILE, $arq1);
   my @file = <MYFILE>;
   close (MYFILE);
   print "file to rename:\t";
   my $arq2 = <STDIN>;
   open (MYFILE2, $arq2);
   my @file2 = <MYFILE2>;
   close (MYFILE2);
   my @new_file=();
   my $count = ();
   open (NEW_FILE, '>>plant_names_primer_bind_renamed.txt');
   foreach my $line2 (@file2) { 
           my @fields = split (/,/, $line2);
           my $accession2 = shift(@fields);
                   foreach my $line (@file) {
                           if ($line =~ /^>/) {    
                           my $rev = reverse $line;
                           chop ($rev);
                           my $header = reverse $rev;
                           my @header = split (/ /, $header);
                           my $accession = shift (@header);
                                 if ($accession =~ /$accession2/)        {       
                   $count++;
                   print "$accession2 match $accession\t@header\t@fields\n\n";
                   print "$count\n";
                   push (@new_file, ("$accession2\t@header\t@fields"));
                   print NEW_FILE @new_file;
           }      
        }       
      }       
   }  





【问题讨论】:

标签: regex perl


【解决方案1】:

这是一个示例,我在开始处理底漆验证文件之前将多 fasta 文件头读入哈希。这样我就避免了双重for循环:

use feature qw(say);
use strict;
use warnings;
{
    my $fasta_data = read_fasta_file();
    print "file to rename:\t";
    chomp (my $fn = <STDIN>);
    open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
    my $save_fn = 'plant_names_primer_bind_renamed.txt';
    open ( my $save_fh, '>', $save_fn ) or die "Could not open file '$save_fn': $!";
    my $count = 0;
    while (my $line = <$fh>) {
        chomp $line;
        my @data = split /,/, $line;
        if (@data) {
            my $key = $data[0];
            my $def = $fasta_data->{$key};
            if (defined $def) {
                #say ++$count;
                say $save_fh join "\t", $key, $def, @data[1..$#data];
            }
        }
    }
    close $save_fh;
    close $fh;
}  


sub read_fasta_file {
    print "multifasta:\t";
    chomp(my $fn = <STDIN>);
    open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
    my %data;
    while (my $line = <$fh>) {
        chomp $line;
        my ($key, $value ) = $line =~ /^>(\S+)\s+(.*)$/;
        $data{$key} = $value if defined $value;
    }
    close $fh;
    return \%data;
}

【讨论】:

  • 谢谢,它几乎成功了,但它没有正确写入输出行,我认为这是因为我们正在尝试编写嵌套数组,你不觉得吗?所以也许它弄乱了每个数组的内部组件......你的脚本写了 418 行,很好,它修复了循环,但它写的都是混合的,看:AB456050UniplantRoncirus49rifoli68a geneforwardTCCCGHYTGAYYTGRGGTCDC 26S20RNA,c71.4ete 和部分 sequ56.5 - 69.8men_voucher : THS:77968。我上传了我的文件,如果你想帮助我,就在我的问题之后。非常感谢
  • 好的,很好。 " 看:AB456050UniplantRoncirus..." :我下载了您的文件 input1_only_its.fastainput2_plant_names_primer_bind_sorted.txt,但我在这些文件中找不到对 "Roncirus" 的任何引用,所以我不能重现你给出的输出
  • 另请注意:您的文件是 DOS(windows 类型行尾)格式,因此我必须先转换为 UNIX 行尾,然后才能使用我的脚本,请参阅 man fromdos
  • 关于“Roncirus”我在 2 个输入中的任何一个中都没有找到这个名称的任何引用,很奇怪......关于文件,它与上传者有关,因为我正在工作在 unix 系统上。
  • 我没有,因为我直接从我工作的服务器上获取它们,所以我没有考虑转换,windows 只在网站上上传,我应该做点不同的事情吗?你能把文件 wc 给我看看是否相同吗?
猜你喜欢
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
相关资源
最近更新 更多