Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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 如何从命令行中找到两个文件的集合子集?_Linux_Bash_Unix_Set_Zsh - Fatal编程技术网

Linux 如何从命令行中找到两个文件的集合子集?

Linux 如何从命令行中找到两个文件的集合子集?,linux,bash,unix,set,zsh,Linux,Bash,Unix,Set,Zsh,我有两个带排序行的文件。一个文件(B)是另一个文件(a)的子集。我希望找到A中所有不在B中的行。理想情况下,我希望创建一个包含这些行的文件(C)。这在Unix中可能吗?我正在寻找一个单行命令来完成这项工作,而不是编写脚本。我查看了join和diff命令,但找不到执行此操作的命令选项。谢谢你的帮助。这个怎么样: grep -v -f B A > C 这将抑制公共线: comm -3 a b 您也可以使用diff来实现这一点。Diff(与@johlo的grep-answer不同)关心顺序,

我有两个带排序行的文件。一个文件(B)是另一个文件(a)的子集。我希望找到A中所有不在B中的行。理想情况下,我希望创建一个包含这些行的文件(C)。这在Unix中可能吗?我正在寻找一个单行命令来完成这项工作,而不是编写脚本。我查看了
join
diff
命令,但找不到执行此操作的命令选项。谢谢你的帮助。

这个怎么样:

grep -v -f B A > C

这将抑制公共线:

comm -3 a b

您也可以使用diff来实现这一点。Diff(与@johlo的grep-answer不同)关心顺序,处理未排序的文件(与@johnshen64的comm-answer不同):

因此,考虑到顺序,您可以使用管道仅获取省略的行:

$ diff -dbU0 a b | tail -n +4 | grep ^- | cut -c2-
c

Awk解决方案

输入文件

a

aaa
bbb
ccc
b

ccc
ddd
eel
代码

awk ' NR==FNR { A[$0]=1; next; }
{ if ($0 in A) { A[$0]=0; } }
END { for (k in A) { if (A[k]==1) { print k; } } } ' a b > c
c(输出文件)


join
命令将执行您要求的操作:

join -v 1 fileA fileB > fileC
演示:

$ cat fileA
a
c
d
g
h
t
u
v
z
$ cat fileB
a
d
g
t
u
z
$ join -v 1 fileA fileB
c
h
v
这假设已排序的文件如您在问题中所述。对于未排序的文件:

join -v 1 <(sort fileA) <(sort fileB)

join-v1,如果您想在这两个文件中找到公共行,您可以使用
comm-12ab
创建第三个文件c当然可以使用
comm-3ab>c
OP专门要求非脚本解决方案。给定,您已将脚本放在命令行上,但是。。。
$ cat fileA
a
c
d
g
h
t
u
v
z
$ cat fileB
a
d
g
t
u
z
$ join -v 1 fileA fileB
c
h
v
join -v 1 <(sort fileA) <(sort fileB)