Linux 在Unix中查找集补码
鉴于这两个文件:Linux 在Unix中查找集补码,linux,unix,comm,set-operations,Linux,Unix,Comm,Set Operations,鉴于这两个文件: $ cat A.txt $ cat B.txt 3 11 5 1 1 12 2 3 4 2 我想找到A中的行号,但B中的行号不是。 它的unix命令是什么 我试过了,但似乎失败了: comm -3 <(sort -n A.txt) <(sort -n B.txt) | sed 's/\t//g' comm-3你可
$ cat A.txt $ cat B.txt
3 11
5 1
1 12
2 3
4 2
我想找到A中的行号,但B中的行号不是。
它的unix命令是什么
我试过了,但似乎失败了:
comm -3 <(sort -n A.txt) <(sort -n B.txt) | sed 's/\t//g'
comm-3你可以试试这个
$ awk 'FNR==NR{a[$0];next} (!($0 in a))' B.txt A.txt
5
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
这将从cli设置操作
它可以通过编写类似于在Makefile中编写的定义来执行集合操作:
someUnion: "file-1.txt" \/ "file-2.txt"
someIntersection: "file-1.txt" /\ "file-2.txt"
someDifference: someUnion - someIntersection
很酷,你应该去看看。我个人不建议使用非为作业构建的特殊命令来执行集合操作。如果确实需要执行许多集合操作,或者有任何集合操作相互依赖,那么它将无法正常工作。不仅如此,setdown还允许您编写依赖于其他集合操作的集合操作
不管怎么说,我觉得这很酷,你应该去看看
注意:我认为Setdown比comm好得多,因为Setdown不要求您对输入进行正确排序。相反,Setdown将为您的输入排序,并使用外部排序。所以它可以处理大量文件。我认为这是一个很大的好处,因为我忘记把我传递给COMM的文件排序的次数超过了计数。 < P>这里有另一种方法,用<代码>连接< /代码>:
join -v1 <(sort A.txt) <(sort B.txt)
join-v1您可能有充分的理由使用Unix单行程序,但您是否考虑过编写Perl或Python脚本来实现这一点?这可能会更快地编写,更容易阅读和修改。Python在语言中内置了基于集合的操作,因此只需几行代码,您就可以实现您在这里尝试执行的操作。@avpx:您是对的。在Python中,它就像''一样简单。join(set(open('A.txt'))-set(open('B.txt'))
@Alok:这是一种非常好的方法,当然比我写的方法要短。太好了。@ghostdog74:奇怪了,为什么我的机器会有不同的结果:3,5,1,2,4,你在运行什么操作系统?在Solaris上使用nawk。
$ comm -23 <(sort -u A.txt) <(sort B.txt)
120
someUnion: "file-1.txt" \/ "file-2.txt"
someIntersection: "file-1.txt" /\ "file-2.txt"
someDifference: someUnion - someIntersection
join -v1 <(sort A.txt) <(sort B.txt)