复制一个文件中的选定行,并在选定行后将这些行插入另一个文件中

时间:2015-01-09 14:08:14

标签: perl

这是我的问题,假设我有一个文件 file1.txt内容:

abc.. 
def.. 
ghi.. 
def..

和第二个文件file2.txt,内容为:

xxx..
yyy..
zzz..

现在我要将file1.txt中以“def”开头的所有行复制到file2.txt,并在file2.txt

中的“yyy ...”行后面追加

预期产出:

xxx...
yyy...
def...
def...
zzz...

我是perl的新手,我尝试为此编写简单的代码,但最终输出只附加在文件的末尾

#!/usr/local/bin/perl -w 
use strict; 
use warnings;
use vars qw($filecontent $total);
my $file1 = "file1.txt";
open(FILE1, $file1) || die "couldn't open the file!";
open(FILE2, '>>file2.txt') || die "couldn't open the file!";
  while($filecontent = <FILE1>){
    if ( $filecontent =~ /def/ ) {
      chomp($filecontent);
       print FILE2 $filecontent ."\n";
      #print FILE2 $filecontent ."\n" if $filecontent =~/yyy/;
    }  
  } 
 close (FILE1); 
 close (FILE2);

perl程序的输出是

xxx...
yyy...
zzz...
def...
def...

3 个答案:

答案 0 :(得分:5)

我使用临时文件。

  1. 从FILE2读取并打印所有行(到temp)直到你点击&#34; yyy&#34;
  2. 阅读并打印所有&#34; def&#34;来自FILE1
  3. 的行(到temp)
  4. 阅读并打印(至临时)FILE2的其余部分
  5. 将临时文件重命名为FILE2
  6. use strict; 
    use warnings;
    
    my $file1 = "file1.txt";
    my $file2 = "file2.txt";
    my $file3 = "file3.txt";
    
    open(FILE1, '<', $file1) or die "couldn't open the file!";
    open(FILE2, '<', $file2) or die "couldn't open the file!";
    open(FILE3, '>', $file3) or die "couldn't open temp file";
    
    while (<FILE2>) {
      print FILE3;
      if (/^yyy/) {
        last;
      }
    }
    
    while (<FILE1>) {
      if (/^def/) {
        print FILE3;
      }
    }
    
    while (<FILE2>) {
      print FILE3;
    }
    
    close (FILE1); 
    close (FILE2);
    close (FILE3);
    
    rename($file3, $file2) or die "unable to rename temp file";
    

答案 1 :(得分:2)

最简单的方法是使用Tie::File模块,它允许您以简单的字符串数组的形式访问文件。

我还使用List::MoreUtils中的first_index来查找插入记录的位置。

use strict;
use warnings;

use Tie::File;
use List::MoreUtils qw/ first_index /;

tie my @file1, 'Tie::File', 'file1.txt' or die $!;
tie my @file2, 'Tie::File', 'file2.txt' or die $!;

my $insert = first_index { /^yyy/ } @file2;

for (@file1) {
  if ( /^def/ ) {
    splice @file2, ++$insert, 0, $_;
  }
}

输出(file2.txt)

xxx..
yyy..
def.. 
def..
zzz..

您的测试数据不会涵盖它,但file1.txt的记录会按照它们出现的顺序插入file2.txt

答案 2 :(得分:2)

您可能想尝试IO::All模块:

use IO::All;
my ($f1, $f2, $i) = (io('file1.txt'), io('file2.txt'), 1);
for (@$f2) {
    splice(@$f2, $i, 0, grep /^def/, @$f1), last
        if /^yyy/;
    $i++;
}