我有两个文件列表,我想要差异。 第二个列表中包含更多文件,因为当我区分这两个列表时,它们都按字母顺序排列,我得到的文件(行)存在于两个列表中,但位于不同的位置。
我想区分这两个列表,忽略列表中的行位置。 这样我只会在列表中获得新的或缺少的行。
谢谢。
答案 0 :(得分:20)
您可以尝试这种方法,其中包括“减去”两个列表,如下所示:
$ cat file1
a.txt
b.txt
c.txt
$ cat file2
a.txt
a1.txt
b.txt
b2.txt
1)在file2中打印不在file1中的所有内容,即file2 - file1
$ grep -vxFf file1 file2
a1.txt
b2.txt
2)在file1中打印不在file2中的所有内容,即file1 - file2
$ grep -vxFf file2 file1
c.txt
(然后你可以用这些差异做你想做的事,例如写入文件,排序等)
grep选项说明:
-v, --invert-match select non-matching lines
-x, --line-regexp force PATTERN to match only whole lines
-F, --fixed-strings PATTERN is a set of newline-separated strings
-f, --file=FILE obtain PATTERN from FILE
答案 1 :(得分:11)
执行以下操作:
cat file1 file2 |排序| uniq -u
这将为您提供唯一(即不重复)的行列表。
说明:
1)cat file1 file2将所有条目放入一个列表中
2)排序将对组合列表进行排序
3)uniq -u只输出没有重复的条目
答案 2 :(得分:8)
comm
命令:为了演示,让我们创建两个输入文件:
$ cat <<EOF >a
> a.txt
> b.txt
> c.txt
> EOF
$ cat <<EOF >b
> a.txt
> a1.txt
> b.txt
> b2.txt
> EOF
现在,使用comm
命令来获得所需的问题:
$ comm -2 a b
a.txt
b.txt
c.txt
在第一列中显示柱状输出 缺少文件(a
但不在b
中的行)第二列中的额外文件(b
但不在a
中的行)。
comm
究竟做了什么?如果在没有任何开关的情况下输入命令,则输出如下:
$ comm a b
a.txt
a1.txt
b.txt
b2.txt
c.txt
这显示三列因此:
a
但不在b
a
和b
b
但不在a
编号开关-123
的作用是隐藏输出中的指定列。
例如:
-13
只会生成公共行-12
b
会产生行
-23
a
会产生行
-2
会产生对称差异-123
会导致无输出答案 3 :(得分:3)
对于示例,您引用@Sparr
a
包含
a.txt
b.txt
c.txt
b
包含
a.txt
a1.txt
b.txt
b2.txt
diff a b
给出了
1a2
> a1.txt
3c4
< c.txt
---
> b2.txt
这个输出不符合您的需求是什么?
答案 4 :(得分:0)
如果对行进行排序,则diff应该很好地捕获插入和删除,并仅报告差异。
答案 5 :(得分:0)
在对它们进行差异排序之前对这两个列表进行排序将提供更有用的差异数据。