Linux 如何从命令行中找到两个文件的集合子集?
我有两个带排序行的文件。一个文件(B)是另一个文件(a)的子集。我希望找到A中所有不在B中的行。理想情况下,我希望创建一个包含这些行的文件(C)。这在Unix中可能吗?我正在寻找一个单行命令来完成这项工作,而不是编写脚本。我查看了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不同)关心顺序,
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)