2011-05-20 213 views
1

我有两个文件比较两个文件

文件1内容如下

=========================== ========================

OUTPUT1:--------- 
    orange 
    india 
    US 

xx 

OUTPUT2:--------- 

    orange-1 
    india-1 
    US-1 
xx 

=================== ================================

file2的内容如下

OUTPUT1:--------- 
    orange 
    india 
    US 

xx 

OUTPUT2:--------- 
    orange-1 
    india-1 
    US-2 
xx 

=============================================== ====

我想两个如下

----------------------- 
OUTPUT1: No evolution 
---------------------- 
OUTPUT2: Evolution found 
Before:US-1 
After:US-2 
---------------------- 

是否可以写脚本在Perl与上述要求

任何帮助将非常感激

回答

5

没有perl的差异,但更令人敬畏的:diff

它比较文件:

[[email protected] Desktop]$ diff file1.txt file2.txt 
11c11 
<  US-1 
--- 
>  US-2 

11c11说,更改的文本开始于行11字符11

+0

记录跨越多行时,这是如何工作的? – djna 2011-05-20 06:38:42

+0

呐喊,代码格式现在显示更多;) – Blender 2011-05-20 06:39:27

+0

所以现在比较给我们“无关紧要”的变化,哪个记录有US-1 => US-2变化?我声称简单的差异本身是不够的。 – djna 2011-05-20 06:49:58

0

可能在Perl,可以肯定,这是一个非常强大的语言。

难度的程度会受到我们对数据所做假设的影响。它是否分类?这些文件有多大?

如果数据未排序并且文件太大而无法完全保存在内存中,那么您可能需要采用管道方法,首先进行排序然后进行“区分”,在这种情况下,如果您有权访问Unix遗产诸如diff和sort之类的工具可能甚至不需要Perl。

假设你想使用Perl,我建议分阶段看问题:

  1. 识别“记录”,其跨越多行。编写代码消耗单个文件并构建每个记录的表示。
  2. 解决排序问题,如果需要构建包含排序记录的中间文件。
  3. 如果您可以在内存中构建一个整个文件的散列,那么在两个排序文件中执行diff操作非常简单,否则您需要从一个文件或另一个文件中提取记录,具体取决于哪个文件具有“下一个”记录。
  4. 已经中标识的改变打印出来的细节所需格式
+0

你好djna, 看起来像适合我的输入,但我是新来的perl和有可能有人可以帮我写脚本在这..我不知道这是否有效的请求或不 – Mahesh 2011-05-23 10:17:48

1

Algorithm::Diff应该做的工作。它适用于数组(即可以解析您喜欢的任何输入格式)并生成diff-like输出。

但是,可能会发现LCS算法对于任务来说有点矫枉过正,您应该使用hash tables代替。