如何将两个文件之间的diff结果合并到第三个文件中?

时间:2014-08-18 06:07:26

标签: regex perl

我正在尝试编写一个将执行以下操作的Perl脚本: 比较来自不同源目录的两个具有相同名称的文件,意思是:

diff source_dir_1/file_1 source_dir_2/files_2

并且对于file_2中的每个更改行(与file_1相比),它将在第三个文件中找到file_1(已在file_2中更改)的行:source_dir_3 / file_3,并将此行替换为file_2中的行。< / p>

例如,对于:

file_1:

  

我的名字是沙哈尔   你好世界
  很高兴见到

file_2

  

我的名字是沙哈尔   再见世界
  很高兴见到

file_3:

  

这条线可以不同   你好世界
  很高兴见到

生成的file_3将是:

file_3_after_script:

  

这条线可以不同   再见世界
  很高兴见到

我在编写时遇到问题,因为有时file_1中的一行会被file_2中的几行替换,

您对如何处理此问题有任何建议吗?

2 个答案:

答案 0 :(得分:0)

你的目标不明确。请始终在SO中包含您在任何问题中尝试过的代码。

然而,当然可以同时打开3个文件并对它们执行逻辑。

以下显示了我对目标的最佳解释。它循环遍历每个文件的行,如果file1和2不同,则从file2打印行,否则打印file3。

use strict;
use warnings;
use autodie;

my $file1 = '...';
my $file2 = '...';
my $file3 = '...';

#open my $fh1, '<', $file1;
#open my $fh2, '<', $file2;
#open my $fh3, '<', $file3;
# Open to strings temporarily to make script self-contained:
open my $fh1, '<', \ "My name is Shahar\nHello World\nNice to meet\n";
open my $fh2, '<', \ "My name is Shahar\nGoodbye World\nNice to meet\n";
open my $fh3, '<', \ "This line can be different\nHello World\nNice to meet\n";

while (! grep eof $_, $fh1, $fh2, $fh3) {
    my $line1 = <$fh1>;
    my $line2 = <$fh2>;
    my $line3 = <$fh3>;

    print $line1 ne $line2 ? "file2: $line2" : "file3: $line3";
}

print "file3: $_" while (<$fh3>); # Print rest of file (if any)

输出:

file3: This line can be different
file2: Goodbye World
file3: Nice to meet

答案 1 :(得分:0)

试试这个

open (file1,'file_1');
open (file2,'file_2');
open (file3,'file_3');
@f1= <file1>;
@f2 = <file2>;
@f3 = <file3>;
print "$f3[0]\n$f2[1]\n$f1[2]\n";

这也会提供您尝试的输出。