![比较两个文件并打印不匹配的行](https://linux22.com/image/35498/%E6%AF%94%E8%BE%83%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%E5%B9%B6%E6%89%93%E5%8D%B0%E4%B8%8D%E5%8C%B9%E9%85%8D%E7%9A%84%E8%A1%8C.png)
我有两个包含以下数据的文件;我需要两个文件之间的差异。
我尝试过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