在 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()
.
的调用来轻松调整创建的输出文件的名称
我能够生成包含如下内容的散列:
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()
.