比较两个文件并打印不匹配的行

比较两个文件并打印不匹配的行

我有两个包含以下数据的文件;我需要两个文件之间的差异。

我尝试过diff,但它还显示了两个文件中常见的行:(22372 Dec 4 15:36 /opt/apache-tomcat-6.0.36/webapps/new/new.txt).

第一个文件:(文件1中同样存在多个数据)

22677 Dec 4 15:36 /opt/apache-tomcat-6.0.36/webapps/new/abc.txt

22372 Dec 4 15:36 /opt/apache-tomcat-6.0.36/webapps/new/new.txt

第二个文件:(文件2中同样存在多个数据)。

22372 Dec 4 15:36 /opt/apache-tomcat-6.0.36/webapps/new/new.txt

22677 Dec 3 15:36 /opt/apache-tomcat-6.0.36/webapps/new/abc.txt

12344 Dec 10 15:36 /opt/apache-tomcat-6.0.36/webapps/abc/.../test.txt

我需要以下输出:

22677 Dec 3 15:36 /opt/apache-tomcat-6.0.36/webapps/new/abc.txt

12344 Dec 10 15:36 /opt/apache-tomcat-6.0.36/webapps/abc/.../test.txt

答案1

这似乎是使用 comm 的绝佳机会。

来自 GNU coreutils 手册页 (v8.30):

With  no  options,  produce  three-column  output.  Column one contains
lines unique to FILE1, column two contains lines unique to  FILE2,  and
   column three contains lines common to both files.

   -1     suppress column 1 (lines unique to FILE1)

   -2     suppress column 2 (lines unique to FILE2)

   -3     suppress column 3 (lines that appear in both files)

使用此信息,我们可以删除唯一的行file1以及两个文件中存在的行。

$ comm -1 -3 <(sort file1) <(sort file2)
12344 Dec 10 15:36 /opt/apache-tomcat-6.0.36/webapps/abc/.../test.txt
22677 Dec 3 15:36 /opt/apache-tomcat-6.0.36/webapps/new/abc.txt

-1 和 -3 删除文件 1 特有的所有行以及两者共有的所有行。

由于排序,它会改变输出的顺序,但这似乎不是基于问题的考虑因素。

如果输入已经排序,您可以跳过排序

$ comm -1 -3 file1 file2

答案2

使用diff -u file1 file2 | sed -nr 's/^+([^+].*)/\1/p'

输出:

22677 12 月 3 日 15:36 /opt/apache-tomcat-6.0.36/webapps/new/abc.txt
12344 12 月 10 日 15:36 /opt/apache-tomcat-6.0.36/webapps/abc/.../test 。TXT

如果您需要它们之间的空行,请使用
diff -u file1 file2 | sed -nr 's/^+([^+].*)/\1\n/p'

输出:

22677 12 月 3 日 15:36 /opt/apache-tomcat-6.0.36/webapps/new/abc.txt

12344 12 月 10 日 15:36 /opt/apache-tomcat-6.0.36/webapps/abc/.../test.txt

相关内容