6

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

4

5 回答 5

13

这将抑制常见的行:

comm -3 a b
于 2012-05-18T20:05:16.340 回答
5

这个怎么样:

grep -v -f B A > C
于 2012-05-18T20:03:50.027 回答
3

你也可以用 diff 来做到这一点。Diff(与@johlo 的 grep 答案不同)关心顺序,适用于未排序的文件(与@johnshen64 的 comm 答案不同):

$ cat a
a
b
c
d
e
$ cat b
a
b
f
d
e
$ diff -dbU0 a b
--- a   2012-05-18 16:02:30.603386016 -0400
+++ b   2012-05-18 16:02:45.547817122 -0400
@@ -3 +3 @@
-c
+f

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

$ diff -dbU0 a b | tail -n +4 | grep ^- | cut -c2-
c
于 2012-05-18T20:09:34.263 回答
1

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)
于 2012-05-18T22:13:30.943 回答
0

awk 解决方案

输入文件

一种

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(输出文件)

bbb
aaa
于 2012-05-18T20:21:05.493 回答