使用perl将输入文件拆分为多个文件
Split input files into multiple file using perl
我有一个格式如下的输入文件,
Line 1 ......
Line 2 ......
Line 3 ......
Line 4 ......
run_diagnosis ./FAILCYCLE/pat.UMK004_W13_X3Y12.dat.trans -cycle_offset 1 -verbose
Line 48 ....
Line 49 ....
Line 50 .....
run_diagnosis ./FAILCYCLE/pat.UMK004_W13_X13Y10.dat.trans -cycle_offset 1 -verbose
Line 52 .....
Line 53 .....
Line 53 .....
run_diagnosis ./FAILCYCLE/pat.UMK004_W13_X15Y4.dat.trans -cycle_offset 1 -verbose
Line 55 .....
Line 56 .....
Line 57 .....
我搜索的关键字是 "run_diagnosis"。
我想在输入文件中将内容拆分为多个文件(文件数将等于关键字 "run_diagnosis" 的出现次数)。
第一次出现"run_diagnosis"以上的数据为无用内容。
我希望输出是这样的,
文件 1 :
run Diagnosis ./FAILCYCLE/pat.UMK004_W13_X3Y12.dat.trans -cycle_offset 1 -verbose
Line 48 ....
Line 49 ....
Line 50 .....
文件 2 :
run_diagnosis ./FAILCYCLE/pat.UMK004_W13_X13Y10.dat.trans -cycle_offset 1 -verbose
Line 52 .....
Line 53 .....
Line 53 .....
依此类推...直到最后一次出现关键字 "run_diagnosis"。
我尝试过使用 array ,但它只能打印关键字的第一次和第三次出现并跳过第二次和第四次。
要创建的文件的名称也来自 "run_diagnosis" 行条目。
在我的例子中,文件 1 的名称将是:UMK004_13_3_12.ext of the input file passed
my $file_in = 'Diagnosis_add_seal_ring.ppd';
my $ext = (fileparse($file_in,'\..*'))[2];
my $start_of = 'Unwanted_Content.txt';
my $line;
my @grabbed;
open my $IN, "<", $file_in or die "unable to open $file_in $!";
open my $OUT, ">", $start_of or die "unable to open $start_of file $!";
while ($line = <$IN>) {
if ($line =~ /^run_diagnosis/) {
my $file_name = (split /\./, $line)[2] . $ext;
push @grabbed, $line;
while (<$IN>) {
last if /^run_diagnosis/;
push @grabbed, $_;
}
open $OUT, ">", $file_name or die "... $!";
print $OUT @grabbed;
undef(@grabbed)
}
close $OUT;
}
你能指导我吗?
这个程序会按照你的要求去做。只要找到 run_diagnosis
行
,它就会打开一个新的输出文件
use strict;
use warnings;
my $file_in = 'Diagnosis_add_seal_ring.ppd';
open my $fh, '<', $file_in or die qq{Unable to open "$file_in" for input: $!};
my ($file_ext) = $file_in =~ /(\.[^.]*)\z/;
my $filenum;
my $fh_out;
while ( <$fh> ) {
if ( /^run_diagnosis/ ) {
my $file_out = (split /\./)[2] . $file_ext;
warn $file_out, "\n";
open $fh_out, '>', $file_out or die qq{Unable to open "$file_out" for output: $!};
select $fh_out;
}
print if $fh_out;
}
输出
UMK004_W13_X3Y12.ppd
UMK004_W13_X13Y10.ppd
UMK004_W13_X15Y4.ppd
您可以在读取输入的同时即时打开输出文件。每当遇到 ^run_diagnosis
时,只需打开一个新的输出文件并使用相同的文件句柄变量继续写入:
#!/usr/bin/perl
use strict;
use warnings;
my $file_in = 'Diagnosis_add_seal_ring.ppd';
my ($ext) = $file_in =~ /([^.]+)$/;
open my $IN, "<", $file_in or die "unable to open $file_in $!";
my $OUT;
my $file_num = 0;
while (<$IN>) {
if (/^run_diagnosis[^.]+\.[^.]+\.([^.]+)/) {
my $file_out = ".$ext";
open $OUT, ">", $file_out or die "unable to open $file_out file $!";
$file_num++;
}
print $OUT $_ if ($file_num);
}
#!/usr/bin/env perl
use v5.20;
use experimental qw/signatures postderef/;
use autodie;
my $i = 0;
my $fh;
while(<>)
{
if($_ =~ m/run_diagnosis/)
{
$i++;
open $fh, ">", "File_".$i.".txt";
writeFile($_, $fh);
}else
{
unless($i==0)
{
open $fh, ">>", "File_".$i.".txt";
writeFile($_, $fh)
}
}
}
sub writeFile($line, $fh)
{
print $fh $line;
close $fh;
}
我有一个格式如下的输入文件,
Line 1 ......
Line 2 ......
Line 3 ......
Line 4 ......
run_diagnosis ./FAILCYCLE/pat.UMK004_W13_X3Y12.dat.trans -cycle_offset 1 -verbose
Line 48 ....
Line 49 ....
Line 50 .....
run_diagnosis ./FAILCYCLE/pat.UMK004_W13_X13Y10.dat.trans -cycle_offset 1 -verbose
Line 52 .....
Line 53 .....
Line 53 .....
run_diagnosis ./FAILCYCLE/pat.UMK004_W13_X15Y4.dat.trans -cycle_offset 1 -verbose
Line 55 .....
Line 56 .....
Line 57 .....
我搜索的关键字是 "run_diagnosis"。
我想在输入文件中将内容拆分为多个文件(文件数将等于关键字 "run_diagnosis" 的出现次数)。
第一次出现"run_diagnosis"以上的数据为无用内容。 我希望输出是这样的,
文件 1 :
run Diagnosis ./FAILCYCLE/pat.UMK004_W13_X3Y12.dat.trans -cycle_offset 1 -verbose
Line 48 ....
Line 49 ....
Line 50 .....
文件 2 :
run_diagnosis ./FAILCYCLE/pat.UMK004_W13_X13Y10.dat.trans -cycle_offset 1 -verbose
Line 52 .....
Line 53 .....
Line 53 .....
依此类推...直到最后一次出现关键字 "run_diagnosis"。
我尝试过使用 array ,但它只能打印关键字的第一次和第三次出现并跳过第二次和第四次。
要创建的文件的名称也来自 "run_diagnosis" 行条目。
在我的例子中,文件 1 的名称将是:UMK004_13_3_12.ext of the input file passed
my $file_in = 'Diagnosis_add_seal_ring.ppd';
my $ext = (fileparse($file_in,'\..*'))[2];
my $start_of = 'Unwanted_Content.txt';
my $line;
my @grabbed;
open my $IN, "<", $file_in or die "unable to open $file_in $!";
open my $OUT, ">", $start_of or die "unable to open $start_of file $!";
while ($line = <$IN>) {
if ($line =~ /^run_diagnosis/) {
my $file_name = (split /\./, $line)[2] . $ext;
push @grabbed, $line;
while (<$IN>) {
last if /^run_diagnosis/;
push @grabbed, $_;
}
open $OUT, ">", $file_name or die "... $!";
print $OUT @grabbed;
undef(@grabbed)
}
close $OUT;
}
你能指导我吗?
这个程序会按照你的要求去做。只要找到 run_diagnosis
行
use strict;
use warnings;
my $file_in = 'Diagnosis_add_seal_ring.ppd';
open my $fh, '<', $file_in or die qq{Unable to open "$file_in" for input: $!};
my ($file_ext) = $file_in =~ /(\.[^.]*)\z/;
my $filenum;
my $fh_out;
while ( <$fh> ) {
if ( /^run_diagnosis/ ) {
my $file_out = (split /\./)[2] . $file_ext;
warn $file_out, "\n";
open $fh_out, '>', $file_out or die qq{Unable to open "$file_out" for output: $!};
select $fh_out;
}
print if $fh_out;
}
输出
UMK004_W13_X3Y12.ppd
UMK004_W13_X13Y10.ppd
UMK004_W13_X15Y4.ppd
您可以在读取输入的同时即时打开输出文件。每当遇到 ^run_diagnosis
时,只需打开一个新的输出文件并使用相同的文件句柄变量继续写入:
#!/usr/bin/perl
use strict;
use warnings;
my $file_in = 'Diagnosis_add_seal_ring.ppd';
my ($ext) = $file_in =~ /([^.]+)$/;
open my $IN, "<", $file_in or die "unable to open $file_in $!";
my $OUT;
my $file_num = 0;
while (<$IN>) {
if (/^run_diagnosis[^.]+\.[^.]+\.([^.]+)/) {
my $file_out = ".$ext";
open $OUT, ">", $file_out or die "unable to open $file_out file $!";
$file_num++;
}
print $OUT $_ if ($file_num);
}
#!/usr/bin/env perl
use v5.20;
use experimental qw/signatures postderef/;
use autodie;
my $i = 0;
my $fh;
while(<>)
{
if($_ =~ m/run_diagnosis/)
{
$i++;
open $fh, ">", "File_".$i.".txt";
writeFile($_, $fh);
}else
{
unless($i==0)
{
open $fh, ">>", "File_".$i.".txt";
writeFile($_, $fh)
}
}
}
sub writeFile($line, $fh)
{
print $fh $line;
close $fh;
}