2011-11-29 190 views
1

我想在Linux中比較兩個文件,但比較不應該基於逐行比較,我想將結果轉儲到另一個文件。 例如:linux文件比較

文件1是:

ABC 
B 
KLM 
JAH 
MONU 
PANDA 

文件2:

HELLO 
PRETTI 
ABC 
B 
LKMO 

現在,我想要的是獲取文件1之間的差異,並通過文件2內容明智的,而不是線(file1-file2)即文件1中的內容不在2中

區別文件:

KLM 
JAH 
MONU 
PANDA 

我試圖與diffcomm在Linux,但它顯示的結果通過逐行比較

+0

needleman-wunch算法會有什麼用處? http://search.cpan.org/~vbar/Algorithm-NeedlemanWunsch-0.03/lib/Algorithm/NeedlemanWunsch.pm – Eamorr

+0

爲了得到一個有價值的迴應,你需要描述你想要使用的確切算法。看看你的例子,看起來你正在對空格進行標記,並忽略file2中沒有出現在file1中的內容。但這只是一個猜測。 – kdgregory

+0

實際上文件的內容由換行符分隔,而不是由空格分隔。 – monucool

回答

0

我從你的exaple輸出推斷,要計算Levenshtein distance之間(也稱爲編輯距離)兩個文件。

引用Wikipedia

的Levenshtein距離也可以兩個較長 字符串,但計算它的成本,這是大致成正比 兩個字符串的長度的乘積之間被計算,使得該不切實際。

那麼你的文件有多大?你跟蹤字符或單詞嗎?對於小文件(少量字符或文字,視情況而定),您可以編寫自己的命令行Levenshtein距離工具。

+0

我正在跟蹤單詞,單詞低於另一列,即排列在一列中 – monucool

5
sort file1.txt file2.txt file2.txt | uniq -u 

這個排序到位file1和兩次文件2。當過濾唯一值,只發生在文件1的值只有FILE1.TXT允許重複相同的值將報告

,你可能想預處理,制定變薄有點複雜:

sort <(sort -u file1.txt) file2.txt file2.txt | uniq -u 
+0

這就是巧妙地使用排序和uniq你在那裏! – Miquel

+0

你能解釋一下爲什麼file2被重新排序兩次。你可以解釋一下內部發生了什麼。 – monucool

+0

@monucool:它不只是排序兩次,它是兩次。這可以確保file2_中的所有行都不會被報告(因爲它'發生'兩次)。請注意,如果'file2.txt'包含10行,'sort file2.txt file2.txt'按定義返回20行,'sort file2.txt file2.txt | uniq -u'返回** 0行**根據定義 – sehe

0

線條出現的順序是否重要?如果順序並不重要,這在AWK一個非常優雅的解決方案:

awk 'BEGIN { 
    while((getline<"file2.txt")>0) { 
    eliminate[$0] = 1 
    } 
} 
!($0 in eliminate) { print }' file1.txt 
1

我很困惑,爲什麼不呢comm工作?

comm -23 <(sort file1) <(sort file2) 

使用您的示例文件,上面的生產:

JAH 
KLM 
MONU 
PANDA 

這也正是 「文件」 你想,模排序。現在如果你想讓它們按file1的順序排序,那就是另一回事了。我假設你的問題不具有被抑制的第二列,這就是你有你「由線對比線」,即:

$ comm -3 <(sort file1) <(sort file2) 
    HELLO 
JAH 
KLM 
    LKMO 
MONU 
PANDA 
    PRETTI 

在生產「差異文件」的事與原始排序:

$ comm -23 <(sort file1) <(sort file2)|grep -f - file1 
KLM 
JAH 
MONU 
PANDA 
+0

對於標準UNIX工具。 +1的'grep -f'技巧,我從來沒有用過。具有很大的意義。 – sehe