Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在Unix中查找集补码_Linux_Unix_Comm_Set Operations - Fatal编程技术网

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)