perl比较文件以查找其中一个文件中缺少的行

时间:2012-08-27 19:59:35

标签: perl

/* format of the files:123|0|15454215|desc|11/30/2012|N|Y|
open FILE1, "/home/1.txt" or die $!;
open FILE2, "/home/2.txt" or die $!;

while (<FILE2>) {
  @old_item = split(/\|/);
  if (<FILE1> !~ /$old_item[0]\|$old_item[1]\|$old_item[2]/) {
    print "$old_item[0]|$old_item[1]|$old_item[2]|$old_item[3]|$old_item[4]|$old_item[5]|$old_item[6]|DE|\n";
  }
}

我在这里做的是打开两个文件然后比较它们以查找第一个而不是第二个中的任何行然后输出带有一些旧信息和新信息的行。

但是发生的事情是,一旦它找到一条不在第二个文件中但在第一个文件中开始打印每一行的行。我做错了什么,是否有更简单的方法。

5 个答案:

答案 0 :(得分:6)

为什么不使用diff -u或其他一些?如果您需要Perl解决方案,请查看Algorithm::Diff

答案 1 :(得分:1)

我认为正在发生的事情是因为你逐行读取每个文件,一条额外的行导致所有行都关闭(因为其中一个文件将在其计数中提前一行,可以这么说)。如果您仍然希望为此编写自己的perl代码,可能有助于将文件加载到数组中并进行比较,只在需要时递增索引。

答案 2 :(得分:1)

有一个模块用于比较perl中的两个文件。

ALgorithm :: Diff模块,

算法::差异 - 计算`智能&#39;两个文件/列表之间的差异,它将逐行比较两个文件并完全检查它。

答案 3 :(得分:0)

查看您的数据会很有用。但是做了一个有根据的猜测..用调试器来完成这个,我想你会看到发生了什么,一旦找到缺失的行,你就跳到的下一行输入溪流。

现在你已经为其余的输入提出了一个问题。

答案 4 :(得分:0)

发生这种情况的原因是,它找到了不同长线的差异。

您必须添加一些代码才能搜索匹配的行以重新同步文件读取器。