1

我有两个文件 a.unl 和 b.unl。内容是:

#a.unl
300111
302130
300042
300054
400045

#b.unl
200032
300042
300111
565000
310056

然后有 c.unl 来捕捉差异。如果 a.unl 中的一行与 b.unl 中的一行匹配,则它不会打印到 c.unl。只有在不同时才会打印。我怎么能做到这一点?

非常感谢您的帮助。

4

2 回答 2

4

用于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获取更多详细信息。

于 2013-11-15T05:54:29.017 回答
3

您最好的选择可能是对这两个文件进行排序并comm根据结果运行。如果你有bash你的外壳,你可以使用Process Substitution

comm -3 <(sort a.unl) <(sort b.unl)

这将打印 in 但不在 in 中的所有行,在 ina.unl但不在 in中b.unl的所有行(它们将由制表符缩进);抑制 和 中的线条。b.unla.unl-3a.unlb.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
于 2013-11-15T04:18:46.427 回答