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