如何区分两个文件列表并忽略列表中的位置

时间:2010-09-16 08:04:02

标签: unix diff

我有两个文件列表,我想要差异。 第二个列表中包含更多文件,因为当我区分这两个列表时,它们都按字母顺序排列,我得到的文件(行)存在于两个列表中,但位于不同的位置。

我想区分这两个列表,忽略列表中的行位置。 这样我只会在列表中获得新的或缺少的行。

谢谢。

6 个答案:

答案 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)

这里使用的deft命令是简单的 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

这显示三列因此:

  1. a但不在b
  2. 中的行
  3. ab
  4. 中的行
  5. b但不在a
  6. 中的行

    编号开关-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)

在对它们进行差异排序之前对这两个列表进行排序将提供更有用的差异数据。