2012-05-07 45 views
8

我有兩個文件A和B.我想找到A中不在B中的所有行。在bash /使用標準linux實用程序中執行此操作的最快方法是什麼?這是我迄今爲止的嘗試:如何找到兩個文件的設置差異?

for line in `cat file1` 
do 
    if [ `grep -c "^$line$" file2` -eq 0]; then 
    echo $line 
    fi 
done 

它的工作,但它很慢。有沒有更快的方法來做到這一點?

+0

你可能會顯示一些代碼或解釋你試過的嗎?現在的問題使你看起來像你希望我們爲你做所有的工作。通常情況下,顯示代碼將有助於鼓勵更多的答案和更好的結果。 – jmort253

+0

你也應該定義你所期望的「最快」。這是關於處理時間或編寫代碼的時間。第二,我會去做一些像'diff A B |的東西grep'^ - '' – tonio

+0

@ jmort253,謝謝,我編輯了問題以添加更多詳細信息 – spinlok

回答

20

The BashFAQdescribes doing exactly this with comm,其是標準地正確的方法。

# Subtraction of file1 from file2 
# (i.e., only the lines unique to file2) 
comm -13 <(sort file1) <(sort file2) 

DIFF是用於此任務不太合適,因爲它試圖在塊而不是單個線操作;因此,它必須使用的算法更復雜,而且內存效率更低。

comm自從SUS2(1997)以來一直是part of the Single Unix Specification

+0

這正是我一直在尋找的!謝謝! – spinlok

+0

這是一個方便的程序。我以前沒見過那個。我不知道我的前任系統管理員錯過了什麼其他的shell應用程序的小寶石。 – 2012-05-07 22:00:05

1

'diff'程序是查看文件之間差異的標準unix程序。

% cat A 
a 
b 
c 
d 
% cat B 
a 
b 
e 
% diff A B 
3,4c3 
< c 
< d 
--- 
> e 

用一個簡單的grep和削減一個可以選擇一個行,而不是B.注意傷口比較簡單和線條的空間會拋出其關閉......但概念是存在的。

% diff A B | grep '^<' | cut -f2 -d" " 
c 
d 
2

如果你只是想那些文件A行,但不是在B,你可以對文件進行排序,並將其與差異進行比較。

sort A > A.sorted 
sort B > B.sorted 
diff -u A.sorted B.sorted | grep '^-' 
+4

你不需要臨時文件。 'diff <(sort A)<(sort B)| grep'^ - '' – jordanm

+0

是的,這種方式更加清晰,謝謝 – tonio

相關問題