在 txt 文件中一次处理一行,每处理一行打印一个文件,perl

Process one line at a time in a txt file, print out a file per processed line, perl

我能够生成包含如下内容的散列:

    AAAA => AAAAAAAA 
    TTTT => TTTTTTTT 
    GGGG => GGGGGGGG 
    CCCC => CCCCCCCC 

我有一个包含如下内容的文本文件:

    AAAA    AAAA 
    GGGG 
    TTTT    TTTT    TTTT 
    CCCC    CCCC 

我希望能够打开文本文件,读取每一行,并在该行的内容中搜索与散列中的键匹配的内容。如果有匹配项,我想在特定于文本文件中该行的文件中打印相应的值。我希望获得的第一个文件的输出类似于:

    >AAAA 
    AAAAAAAA 
    >AAAA 
    AAAAAAAA 

第二个文件的输出为:

    >GGGG 
    GGGGGGGG

我知道有办法做到这一点,但我不知所措。任何帮助将不胜感激。谢谢!

到目前为止,这是我的代码。请注意,我设置为只写入一个文件,但我需要写入与前面提到的文本文件中的行一样多的文件(数百到数千)。

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

    my $dir = ("Users/rob/Documents/Lamda");  
    open (INFILE, "<", "Users/rob/dnaclust/testscript.txt") or die $!; 
    open (OUTFILE, ">", "Users/rob/Codes/testscript.txt") or die $!; 

    my %hash = (); 

    my @ArrayOfFiles = glob "$dir/*";  

    print join("\n", @ArrayOfFiles), "\n"; 

    foreach my $file (@ArrayofFiles){ 
       open (my $sequence, $file) or die "can't open file: $!";
       while (my $line = <$sequence>) {
         if ($line !~/^>/){ 
             my $seq = $line; 
             $seq =~ s/\R//g;
             $seq =~ m/(CATCAT|TACTAC)([TAGC]{18})([TAGC]+)([TAGC]{18})(CATCAT|TACTAC)/;  
            $hash{} = ;   
         }
       } 
    } 
    while (<INFILE>) { 
         chomp; 
         my @fields = split /\n/;  

所以这让我可以一次访问每一行,但现在我只需要将行中的所有元素与哈希中的键匹配,并将值打印到文件中。

我会这样做:

  • 读入你的文件
  • 逐行循环文件
  • Split 任何由 space 分隔的数组
  • 检查这些是否与您的哈希键匹配
  • 如果他们打印出散列的键和值

这并没有告诉您如何将其中的每一个打印到它们自己的文件中,但它应该对您有所帮助。也许这是另一个问题?

open my $infile, '<', 'in.txt' or die $!;

my %hash = (
    AAAA => 'AAAAAAAA', 
    TTTT => 'TTTTTTTT', 
    GGGG => 'GGGGGGGG', 
    CCCC => 'CCCCCCCC'
);

while(<$infile>){
    chomp;
    my @fields = split;
    if ($hash{$fields[0]}){
        foreach (@fields){
            print ">$fields[0]\n";
            print "$hash{$fields[0]}\n";
        }
        print "\n";
    }
}

>AAAA
AAAAAAAA
>AAAA
AAAAAAAA

>GGGG
GGGGGGGG

>TTTT
TTTTTTTT
>TTTT
TTTTTTTT
>TTTT
TTTTTTTT

>CCCC
CCCCCCCC
>CCCC
CCCCCCCC

这似乎符合您的要求。

#!/usr/bin/perl

use strict;
use warnings;

my %convert = (
  AAAA => 'AAAAAAAA',
  TTTT => 'TTTTTTTT',
  GGGG => 'GGGGGGGG',
  CCCC => 'CCCCCCCC',
);

while (<>) {
  my @tokens = split;
  open my $out, '>', "line_$..out" or die $!;
  foreach my $token (@tokens) {
    if (exists $convert{$token}) {
      print $out ">$token\n$convert{$token}\n";
    }
  }
}

你 运行 它,传入输入文件的名称(我真的不喜欢不必要地硬编码文件名)。您可以通过编辑对 open().

的调用来轻松调整创建的输出文件的名称