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

Unix 如何区分两个文件列表并忽略列表中的位置,unix,diff,Unix,Diff,我有两个要区分的文件列表。 第二个列表中有更多的文件,因为当我区分这两个列表时,它们都是按字母顺序排列的,所以我得到了两个列表中存在的文件(行),但它们位于不同的位置 我想区分这两个列表,忽略列表中的行位置。 这样,我将只得到列表中新的或丢失的行 谢谢。如果对行进行了排序,diff应该可以很好地捕捉插入和删除,并且只报告差异。在对两个列表进行排序之前,将提供更有用的diff数据。对于您引用的@spar示例 a包含 a.txt b.txt c.txt a.txt a1.txt b.txt b2.

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

我想区分这两个列表,忽略列表中的行位置。 这样,我将只得到列表中新的或丢失的行


谢谢。

如果对行进行了排序,diff应该可以很好地捕捉插入和删除,并且只报告差异。

在对两个列表进行排序之前,将提供更有用的diff数据。

对于您引用的@spar示例

a
包含

a.txt
b.txt
c.txt
a.txt
a1.txt
b.txt
b2.txt
b
包含

a.txt
b.txt
c.txt
a.txt
a1.txt
b.txt
b2.txt
diff a b

1a2
> a1.txt
3c4
< c.txt
---
> b2.txt
1a2
>a1.txt
3c4
b2.txt

这个输出有什么地方不符合您的需要?

您可以尝试这种方法,包括“减去”两个列表,如下所示:

$ cat file1
a.txt
b.txt
c.txt

$ cat file2
a.txt
a1.txt
b.txt
b2.txt
1) 打印文件2中不在文件1中的所有内容,即文件2-文件1

$ grep -vxFf file1 file2
a1.txt
b2.txt
2) 打印文件1中不在文件2中的所有内容,即文件1-文件2

$ 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
请执行以下操作:

cat文件1文件2 |排序| uniq-u

这将为您提供唯一的行列表(即,不重复)

说明:
1) cat文件1文件2将把所有条目放在一个列表中
2) 排序将对组合列表进行排序
3) uniq-u将只输出没有重复项的条目

此处使用的deft命令是humble
comm
命令: 为了演示,让我们创建两个输入文件:

$ cat <<EOF >a
> a.txt
> b.txt
> c.txt
> EOF

$ cat <<EOF >b
> a.txt
> a1.txt
> b.txt
> b2.txt
> EOF
这显示了一个列输出,第一列中有缺失的文件(在
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
      将导致无输出

    让我解释一下,我有两个列表。第一个:a.txt b.txt c.txt第二个:a.txt a1.txt b.txt b2.txt想要的区别是:a1.txt b2.txt c.txt如果列表已按字母顺序排序,我如何对列表进行排序?列表已按字母顺序排序。这就是问题的基础。我有两个清单。第一:a b c 1秒:1 a b c这些列表应该是相同的,但它们不是根据差异来排列的。但是你的问题是它们都是按字母顺序排列的,你刚才给出的例子是它们不是-是哪一个?如果需要按字母顺序排列,请使用
    sort
    对它们进行排序。您是正确的。一旦我对这两个文件运行了sort命令,它就如我所期望的那样工作了。谢谢。这很有效,但是使用cat和grep需要很长时间。我有很多文件,可能需要一个小时。你不需要使用
    cat
    ,只需
    grep
    cat
    仅用于说明文件的内容。在某些文件是另一个文件的子字符串的情况下,这不起作用。此外,由于文件名将被视为正则表达式,
    字符将被视为任何字符-因此
    a1.txt
    将匹配
    a1ttxt
    。添加了-F标志以将其视为固定字符串而不是正则表达式。太棒了!我用它来生成我的pip requirements.txt
    pip freeze-l | grep-vxFf dev-requirements.txt->requirements.txt
    哇,这真是太好了。这应该是100%的最佳答案。这个
    comm
    命令是多么棒的发现啊!这正是我所要寻找的,因为我不仅想知道哪些条目只存在于一个文件中,而不考虑顺序(如OP),而且还想过滤其中一个文件的结果(如无需构建数组的数组减法)。一个隐藏的宝石的命令肯定。可能是因为它的名字不那么明显而被隐藏了?我同意,这是一个命令的宝石。鉴于它是GNU Coreutils的一部分,我认为这应该被选为正确答案。虽然输入仍然应该首先排序,但这比使用uniq、sort和diff更简单。