2012-08-15 43 views

回答

5

我相信这篇文章对你有用:Set Operations in the Unix Shell。特别的,补集操作就是你所要求的。

+1

有在这篇文章中的错误通信不能正确使用-n排序,例如:comm <(sort -n <<< 4 $ '\ n'55 $'\ n'7)<(sort -n <<< 2 $'\ n'55 $'\ n'8) – 2012-08-15 05:53:58

+1

这是一个链接专用的答案。 – YSC 2017-07-05 12:04:58

7
comm -23 <(command_which_generate_N|sort) <(command_which_generate_M|sort) 

COMM而不选项显示输出的3列:1:仅在第一个文件,2:只有在第二个文件中,3:在这两个文件。 -23删除第二和第三列。

输入文件必须排序。

GNU排序和comm取决于语言环境,例如输出顺序可以是不同的(但内容必须是相同的)

(export LC_ALL=C; comm -23 <(command_which_generate_N|sort) <(command_which_generate_M|sort)) 
1

I wrote a program recently called Setdown,它从CLI设置操作(如组差异)。

它可以通过书面形式类似于你在一个Makefile中写的定义执行组操作:

someUnion: "file-1.txt" \/ "file-2.txt" 
someIntersection: "file-1.txt" /\ "file-2.txt" 
someDifference: someUnion - someIntersection 

它很酷,你应该检查一下。我个人不推荐“在unix shell中设置操作”的帖子。如果您确实需要执行许多设置操作,或者您有任何依赖于对方的设置操作,它将无法正常工作。

无论如何,我认为这很酷,你应该完全检查出来。

+0

该网站似乎已关闭。有没有新的网址? – escitalopram 2016-12-14 16:15:16

+0

这是直接链接到源代码的链接:https://bitbucket.org/robertmassaioli/setdown – 2016-12-23 10:43:07

1

uniq -u (manpage)往往是列表减法最简单的工具:

使用

uniq [OPTION]... [INPUT [OUTPUT]] 
[...] 
-u, --unique 
    only print unique lines 

例子:在目录中找到的列表文件,但不能在B

$ ls a 
file1 file2 file3 
$ ls b 
file1 file3 

$ echo "$(ls a ; ls b)" | sort | uniq -u 
file2 
+0

这是对称的差异,而不是相对的补充。 B中的任何独特元素也将在结果中出现。但是,如果B中没有元素不在A中,那么这很有效。 – Brent 2017-08-29 14:51:30

+0

要回显@Brent这是技术上不设置减法。这是两组之间的对称差异。它仅在两个目录“a”和“b”中的一个中查找所有文件。 – Hunle 2017-09-08 03:41:38