我有兩個文件a.unl和b.unl。內容是:Unix - 如何打印兩個文本文件之間的區別?
#a.unl
300111
302130
300042
300054
400045
#b.unl
200032
300042
300111
565000
310056
然後有c.unl來捕捉差異。 如果a.unl中的一行與b.unl中的一行匹配,則它不會打印到c.unl。只有當它不同時纔打印。 我怎麼能做到這一點?
非常感謝您的幫助。
我有兩個文件a.unl和b.unl。內容是:Unix - 如何打印兩個文本文件之間的區別?
#a.unl
300111
302130
300042
300054
400045
#b.unl
200032
300042
300111
565000
310056
然後有c.unl來捕捉差異。 如果a.unl中的一行與b.unl中的一行匹配,則它不會打印到c.unl。只有當它不同時纔打印。 我怎麼能做到這一點?
非常感謝您的幫助。
最好的辦法是對這兩個文件進行排序,然後在結果上運行comm
。如果你有bash
爲你的shell,你可以使用Process Substitution:
comm -3 <(sort a.unl) <(sort b.unl)
這將打印在a.unl
所有的行,但不是在b.unl
,在b.unl
所有的行,但不是在a.unl
(他們將通過一個標籤縮進); -3
會抑制a.unl
和b.unl
中的行。
如果沒有bash
做,你可能需要類似:
sort a.unl > a.srt
sort b.unl > b.srt
comm -3 a.srt b.srt
rm -f a.srt b.srt
爲了讓更多的近防彈(所以如果你打斷東西它不圍繞離開中間文件),那麼你需要:
tmp=tmp.$$
trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15
sort a.unl > $tmp.a
sort b.unl > $tmp.b
comm -3 $tmp.a $tmp.b
rm -f $tmp.?
trap 0
謝謝,這真的有用。順便說一句,我使用通訊-13和「排序a.unl -o a.unl」,所以我沒有不必要的文件躺在。 – junda
使用diff
來顯示兩個文件之間的差異。
diff -u a.unl b.unl
輸出的樣子:
--- a.unl 2013-11-15 13:51:00.936845493 +0800
+++ b.unl 2013-11-15 13:51:21.373908098 +0800
@@ -1,5 +1,5 @@
+200032
+400042
300111
-302130
-300042
-300054
-400045
+565000
+310056
-
手段從a.unl刪除,+
手段添加到a.unl。
使用man diff
獲取更多詳細信息。
你可以使用'diff',也許? – 2013-11-15 04:08:50