鉴于这两个文件:
$ 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] 举报,一经查实,本站将立刻删除。