2011-05-20 212 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代替。