使用perl将输入文件拆分为多个文件

时间:2015-06-10 08:37:57

标签: regex perl split

我有一个输入文件,格式如下,

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" 我尝试过使用数组的东西,但它只能打印第一次和第三次出现的关键字并跳过第二次和第四次。

此外,要创建的文件的名称来自" run_diagnosis"行录入。
在我的例子中,文件1的名称将是:传递的输入文件的UMK004_13_3_12.ext

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;
}

请你指导我。

3 个答案:

答案 0 :(得分:1)

这个程序可以按照你的要求进行。只要找到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

答案 1 :(得分:1)

您可以在阅读输入时动态打开输出文件。每当遇到^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 = "$1.$ext";
        open $OUT, ">", $file_out or die "unable to open $file_out file $!";
        $file_num++;
    }
    print $OUT $_ if ($file_num);
}

答案 2 :(得分:0)

#!/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;
}