记录分隔符内的记录分隔符
Record separator within a record separator
如何在使用记录分隔符的同时使用子记录分隔符?也许这不是思考我正在尝试做的事情的最佳方式。这是我的目标:
我想在指定的项目行中一次对单个制表符分隔的项目执行 while 循环。对于制表符分隔项的每一行(行),我需要将所有 while 循环的结果打印到一个唯一的文件中。请允许以下示例帮助澄清。
我的输入文件将如下所示。它将被称为 "Clustered_Barcodes.txt"
TTTATGC TTTATGG TTTATCC TTTATCG
TTTATAA TTTATAA TTTATAT TTTATAT TTTATTA
CTTGTAA
我的 perl 代码如下所示:
#!/usr/bin/perl
use warnings;
use strict;
open(INFILE, "<", "Clustered_Barcodes.txt") or die $!;
my %hash = (
"TTTATGC" => "TATAGCGCTTTATGCTAGCTAGC",
"TTTATGG" => "TAGCTAGCTTTATGGGCTAGCTA",
"TTTATCC" => "GCTAGCTATTTATCCGCTAGCTA",
"TTTATCG" => "TAGCTAGCTTTATCGCGTACGTA",
"TTTATAA" => "TAGCTAGCTTTATAATAGCTAGC",
"TTTATAA" => "ATCGATCGTTTATAACGATCGAT",
"TTTATAT" => "TCGATCGATTTATATTAGCTAGC",
"TTTATAT" => "TAGCTAGCTTTATATGCTAGCTA",
"TTTATTA" => "GCTAGCTATTTATTATAGCTAGC",
"CTTGTAA" => "ATCGATCGCTTGTAACGATTAGC",
);
while(<INFILE>) {
$/ = "\n";
my @lines = <INFILE>;
open my $out, '>', "Clustered_Barcode_$..fasta" or die $!;
foreach my $sequence (@lines){
if (exists $hash{$sequence}){
print $out ">$sequence\n$hash{$sequence}\n";
}
}
}
我想要的输出是三个不同的文件。
第一个文件将被称为 "Clustered_Barcode_1.fasta",看起来像:
>TTTATGC
TATAGCGCTTTATGCTAGCTAGC
>TTTATGG
TAGCTAGCTTTATGGGCTAGCTA
>TTTATCC
GCTAGCTATTTATCCGCTAGCTA
>TTTATCG
TAGCTAGCTTTATCGCGTACGTA
请注意,这是格式化的,因此键前面有一个胡萝卜,然后在下一行是更长的关联序列(值)。此文件包含 Clustered_Barcodes.txt
第一行中的所有序列
我的第三个文件应命名为 "Clustered_Barcode_3.fasta",如下所示:
>CTTGTAA
ATCGATCGCTTGTAACGATTAGC
当我运行我的代码时,它只需要输入文件中的第二行和第三行序列。我如何从第一行开始(通过摆脱 \n 对记录分隔符的要求)?然后我如何一次处理每一项,然后将行的结果打印到一个文件中?此外,如果有一种方法可以将序列数合并到文件名中,那就太好了。这将帮助我以后按大小组织文件。例如,名称可能类似于 "Clusterd_Barcodes_1_File_3_Sequences.fasta"。
谢谢大家。
好的,这是一种方法:
#!/usr/bin/perl
use strict;
use warnings;
标准序言。
my %hash = (
"TTTATGC" => "TATAGCGCTTTATGCTAGCTAGC",
"TTTATGG" => "TAGCTAGCTTTATGGGCTAGCTA",
"TTTATCC" => "GCTAGCTATTTATCCGCTAGCTA",
"TTTATCG" => "TAGCTAGCTTTATCGCGTACGTA",
"TTTATAA" => "TAGCTAGCTTTATAATAGCTAGC",
"TTTATAA" => "ATCGATCGTTTATAACGATCGAT",
"TTTATAT" => "TCGATCGATTTATATTAGCTAGC",
"TTTATAT" => "TAGCTAGCTTTATATGCTAGCTA",
"TTTATTA" => "GCTAGCTATTTATTATAGCTAGC",
"CTTGTAA" => "ATCGATCGCTTGTAACGATTAGC",
);
设置序列的散列。
my $infile = 'Clustered_Barcodes.txt';
open my $infh, '<', $infile or die "[=12=]: $infile: $!\n";
打开文件进行阅读。
chomp(my @rows = readline $infh);
my $row_count = @rows;
Slurp 所有行到内存中以获得序列数。如果你有太多的序列,这种方法将不起作用(因为你会 运行 内存不足(但这取决于你有多少 RAM))。
my $i = 1;
for my $row (@rows) {
在行上循环。
my @fields = split /\t/, $row;
将每行拆分为由制表符分隔的字段。
my $outfile = "Clustered_Barcodes_${i}_File_${row_count}_Sequences.fasta";
$i++;
open my $outfh, '>', $outfile or die "[=16=]: $outfile: $!\n";
打开当前输出文件并增加计数器。
for my $field (@fields) {
print $outfh ">$field\n$hash{$field}\n" if exists $hash{$field};
}
将每个字段(及其映射)写入输出文件。
}
我们完成了。与原始代码的主要区别在于使用 split /\t/
和 foreach
循环遍历一行中的字段。
我们也可以做到不吸:
while (my $row = readline $infh) {
chomp $row;
逐行循环。这替换了从 chomp(my @rows = readline $infh);
到 for my $row (@rows) {
.
的 4 行
但是现在我们丢失了$i
和$row_count
变量,所以我们必须改变$outfile
的初始化:
my $outfile = "Clustered_Barcodes_$..fasta";
这应该是您需要的所有更改。 (在这种情况下,您可以通过阅读 $infh
两次(第一次只是为了计数,然后 seek
回到开始)来获得 $row_count
);这留作练习reader.)
无需阅读我在此处看到的整个文件。你只需要遍历每一行的内容:
while(my $line = <INFILE>) {
chomp $line;
open my $out, '>', "Clustered_Barcode_$..fasta" or die $!;
foreach my $sequence ( split /\t/, $line ){
if (exists $hash{$sequence}){
print $out ">$sequence\n$hash{$sequence}\n";
}
}
}
如何在使用记录分隔符的同时使用子记录分隔符?也许这不是思考我正在尝试做的事情的最佳方式。这是我的目标:
我想在指定的项目行中一次对单个制表符分隔的项目执行 while 循环。对于制表符分隔项的每一行(行),我需要将所有 while 循环的结果打印到一个唯一的文件中。请允许以下示例帮助澄清。
我的输入文件将如下所示。它将被称为 "Clustered_Barcodes.txt"
TTTATGC TTTATGG TTTATCC TTTATCG
TTTATAA TTTATAA TTTATAT TTTATAT TTTATTA
CTTGTAA
我的 perl 代码如下所示:
#!/usr/bin/perl
use warnings;
use strict;
open(INFILE, "<", "Clustered_Barcodes.txt") or die $!;
my %hash = (
"TTTATGC" => "TATAGCGCTTTATGCTAGCTAGC",
"TTTATGG" => "TAGCTAGCTTTATGGGCTAGCTA",
"TTTATCC" => "GCTAGCTATTTATCCGCTAGCTA",
"TTTATCG" => "TAGCTAGCTTTATCGCGTACGTA",
"TTTATAA" => "TAGCTAGCTTTATAATAGCTAGC",
"TTTATAA" => "ATCGATCGTTTATAACGATCGAT",
"TTTATAT" => "TCGATCGATTTATATTAGCTAGC",
"TTTATAT" => "TAGCTAGCTTTATATGCTAGCTA",
"TTTATTA" => "GCTAGCTATTTATTATAGCTAGC",
"CTTGTAA" => "ATCGATCGCTTGTAACGATTAGC",
);
while(<INFILE>) {
$/ = "\n";
my @lines = <INFILE>;
open my $out, '>', "Clustered_Barcode_$..fasta" or die $!;
foreach my $sequence (@lines){
if (exists $hash{$sequence}){
print $out ">$sequence\n$hash{$sequence}\n";
}
}
}
我想要的输出是三个不同的文件。 第一个文件将被称为 "Clustered_Barcode_1.fasta",看起来像:
>TTTATGC
TATAGCGCTTTATGCTAGCTAGC
>TTTATGG
TAGCTAGCTTTATGGGCTAGCTA
>TTTATCC
GCTAGCTATTTATCCGCTAGCTA
>TTTATCG
TAGCTAGCTTTATCGCGTACGTA
请注意,这是格式化的,因此键前面有一个胡萝卜,然后在下一行是更长的关联序列(值)。此文件包含 Clustered_Barcodes.txt
第一行中的所有序列我的第三个文件应命名为 "Clustered_Barcode_3.fasta",如下所示:
>CTTGTAA
ATCGATCGCTTGTAACGATTAGC
当我运行我的代码时,它只需要输入文件中的第二行和第三行序列。我如何从第一行开始(通过摆脱 \n 对记录分隔符的要求)?然后我如何一次处理每一项,然后将行的结果打印到一个文件中?此外,如果有一种方法可以将序列数合并到文件名中,那就太好了。这将帮助我以后按大小组织文件。例如,名称可能类似于 "Clusterd_Barcodes_1_File_3_Sequences.fasta"。
谢谢大家。
好的,这是一种方法:
#!/usr/bin/perl
use strict;
use warnings;
标准序言。
my %hash = (
"TTTATGC" => "TATAGCGCTTTATGCTAGCTAGC",
"TTTATGG" => "TAGCTAGCTTTATGGGCTAGCTA",
"TTTATCC" => "GCTAGCTATTTATCCGCTAGCTA",
"TTTATCG" => "TAGCTAGCTTTATCGCGTACGTA",
"TTTATAA" => "TAGCTAGCTTTATAATAGCTAGC",
"TTTATAA" => "ATCGATCGTTTATAACGATCGAT",
"TTTATAT" => "TCGATCGATTTATATTAGCTAGC",
"TTTATAT" => "TAGCTAGCTTTATATGCTAGCTA",
"TTTATTA" => "GCTAGCTATTTATTATAGCTAGC",
"CTTGTAA" => "ATCGATCGCTTGTAACGATTAGC",
);
设置序列的散列。
my $infile = 'Clustered_Barcodes.txt';
open my $infh, '<', $infile or die "[=12=]: $infile: $!\n";
打开文件进行阅读。
chomp(my @rows = readline $infh);
my $row_count = @rows;
Slurp 所有行到内存中以获得序列数。如果你有太多的序列,这种方法将不起作用(因为你会 运行 内存不足(但这取决于你有多少 RAM))。
my $i = 1;
for my $row (@rows) {
在行上循环。
my @fields = split /\t/, $row;
将每行拆分为由制表符分隔的字段。
my $outfile = "Clustered_Barcodes_${i}_File_${row_count}_Sequences.fasta";
$i++;
open my $outfh, '>', $outfile or die "[=16=]: $outfile: $!\n";
打开当前输出文件并增加计数器。
for my $field (@fields) {
print $outfh ">$field\n$hash{$field}\n" if exists $hash{$field};
}
将每个字段(及其映射)写入输出文件。
}
我们完成了。与原始代码的主要区别在于使用 split /\t/
和 foreach
循环遍历一行中的字段。
我们也可以做到不吸:
while (my $row = readline $infh) {
chomp $row;
逐行循环。这替换了从 chomp(my @rows = readline $infh);
到 for my $row (@rows) {
.
但是现在我们丢失了$i
和$row_count
变量,所以我们必须改变$outfile
的初始化:
my $outfile = "Clustered_Barcodes_$..fasta";
这应该是您需要的所有更改。 (在这种情况下,您可以通过阅读 $infh
两次(第一次只是为了计数,然后 seek
回到开始)来获得 $row_count
);这留作练习reader.)
无需阅读我在此处看到的整个文件。你只需要遍历每一行的内容:
while(my $line = <INFILE>) {
chomp $line;
open my $out, '>', "Clustered_Barcode_$..fasta" or die $!;
foreach my $sequence ( split /\t/, $line ){
if (exists $hash{$sequence}){
print $out ">$sequence\n$hash{$sequence}\n";
}
}
}