-1
/* 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";
  }
}

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

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

4

5 回答 5

6

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

于 2012-08-27T20:01:19.293 回答
1

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

于 2012-08-27T20:05:15.077 回答
1

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

ALgorithm::Diff 模块,

Algorithm::Diff - 计算两个文件/列表之间的“智能”差异,它将逐行比较两个文件并对其进行全面检查。

于 2016-07-18T10:50:38.820 回答
0

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

现在,对于其余的输入,您遇到了一个不相上下的问题。

于 2012-08-27T20:04:14.063 回答
0

发生这种情况的原因是它发现了一条线不再同步的差异。

您将不得不添加一些代码来搜索匹配的行以重新同步文件阅读器。

于 2012-08-27T20:04:26.893 回答