我有两个文件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。只有在不同的情况下才能打印。 我怎么能做到这一点?
非常感谢你的帮助。
答案 0 :(得分: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
获取更多详细信息。
答案 1 :(得分:3)
您最好的选择可能是对两个文件进行排序并对结果运行comm
。如果您的shell为bash
,则可以使用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