在Unix中寻找补充集

时间:2010-01-29 05:06:41

标签: linux unix comm set-operations

鉴于这两个文件:

 $ cat A.txt     $ cat B.txt
    3           11
    5           1
    1           12
    2           3
    4           2

我想在B中找到A“BUT NOT”中的行号。 什么是unix命令呢?

我试过这个但似乎失败了:

comm -3 <(sort -n A.txt) <(sort -n B.txt) | sed 's/\t//g' 

5 个答案:

答案 0 :(得分:10)

comm -2 -3 <(sort A.txt) <(sort B.txt)
如果我理解正确的话,

应该做你想做的事。

编辑:实际上,comm需要按字典顺序对文件进行排序,因此您不希望在-n命令中使用sort:< / p>

$ cat A.txt
1
4
112
$ cat B.txt
1
112
# Bad:
$ comm -2 -3 <(sort -n B.txt) <(sort -n B.txt)
4
comm: file 1 is not in sorted order
112
# OK:
$ comm -2 -3 <(sort A.txt) <(sort B.txt)
4

答案 1 :(得分:3)

请注意awk解决方案有效,但在A中保留重复(不在B中); python解决方案减少了结果

还要注意comm不计算真正的集合差异;如果在A中重复一行,并在B中重复较少次,comm将在结果中留下“额外”行:

$ cat A.txt 
120
121
122
122
$ cat B.txt 
121
122
121
$ comm -23 <(sort A.txt) <(sort B.txt)
120
122

如果不希望出现此行为,请使用sort -u删除重复项(仅限A中的欺骗行为):

$ comm -23 <(sort -u A.txt) <(sort B.txt)
120

答案 2 :(得分:2)

你可以试试这个

$ awk 'FNR==NR{a[$0];next} (!($0 in a))' B.txt A.txt
5
4

答案 3 :(得分:1)

I wrote a program recently called Setdown执行从cli设置操作。

它可以通过编写类似于在Makefile中编写的定义来执行set操作:

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

非常酷,你应该检查一下。我个人不建议使用非为作业构建的ad-hoc命令来执行set操作。当您确实需要执行许多设置操作或者您有任何相互依赖的设置操作时,它将无法正常工作。不仅如此,setdown还允许您编写依赖于其他设置操作的集合操作!

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

注意:我认为Setdown比comm好得多,因为 Setdown不需要您正确排序输入。相反,Setdown会为您排序输入并使用外部排序。所以它可以处理大量文件。我认为这是一个主要的好处,因为我忘记对传入comm的文件进行排序的次数是无法计算的。

答案 4 :(得分:1)

这是另一种使用 join 的方法:

join -v1 <(sort A.txt) <(sort B.txt)

joindocumentation

<块引用>

‘-v 文件编号’ 为文件 file-number 中每个不成对的行(“1”或“2”)打印一行,而不是正常输出。