9

对于 shell 程序员来说,这可能是一个非常基本的问题。但是假设我有一个文本文件 A 和 B 并且 B 是 A 的子集。

我想创建一个包含 (AB) 数据的文本文件 C。

所以省略所有常见的行。

文件中的行是数字数据:比如

id , some aspect, other aspec.

谢谢。

4

4 回答 4

12

使用sortuniq

sort a b | uniq -u

如果你想要 A 和 B 之间的线相同,你可以使用uniq -d

sort a b | uniq -d

这当然假设 A 和 B 中的数据完全相同。数据集中不能有任何丢失的空格或制表符。sed如果有,您必须先使用、tr或清理数据awk

编辑

作为彼得。O 指出,如果文件中恰好有完全相同的重复项,这将失败a。如果这是一个问题,您可以通过执行以下操作来解决它:

sort <(sort -u a) b | uniq -u
于 2012-04-26T22:00:26.133 回答
7

有一个名为的实用程序comm仅用于此目的:

comm -23 A B > C

where-2的意思是“拒绝文件 B 独有的行”(你说没有),-3意思是“拒绝两个文件共有的行”。

@BartonChittenden 提出了一个很好的观点:

comm -23 <(sort A) <(sort B) > C
于 2012-04-27T01:55:25.623 回答
4

一种使用方式awk。重定向以将内容保存在任何文件中,而不是STDOUT.

awk 'FNR == NR { data[ $0 ] = 1; next } FNR < NR { if ( $0 in data ) { next } print $0 }' fileB fileA

更新了更有效的命令。感谢彼得.O

awk 'FNR==NR{data[$0]; next}; $0 in data{next}; 1' fileB fileA
于 2012-04-26T22:19:20.140 回答
2
awk 'FNR==NR{a[$0];next}(!($0 in a))' B A
于 2012-05-09T11:22:00.263 回答