微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Unix中寻找Set Complement

鉴于这两个文件

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

我想find在B中的“BUT NOT”中的行号。它的unix命令是什么?

我尝试过,但似乎失败:

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

comm -2 -3 <(sort A.txt) <(sort B.txt)

应该做你想做的,如果我正确理解你的话。

编辑 :其实, comm需要文件按字典顺序排序,所以你不希望-n在你的sort命令:

$ 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

请注意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

你可以试试这个

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

我写了一个最近叫做Setdown的程序 ,它从cli中进行Set操作。

它可以通过编写一个类似于您在Makefile中编写的定义来执行设置操作:

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

它非常酷,你应该检查出来。 我个人不建议使用不是为作业而构建的ad-hoc命令来执行设置操作。 当你真的需要做很多设置操作,或者如果你有任何相互依赖的设置操作,它将无法正常工作。 不仅如此,而且还可以让你编写依赖于其他设置操作的集合操作!

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

注意 :我认为Setdown比comm更好,因为Setdown不要求你正确地对输入进行排序 。 相反,Setdown将会为您排序输入,并使用外部排序。 所以它可以处理大量的文件。 我认为这是一个很大的好处,因为我忘记排序我传入comm的文件次数已经超过了计数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐