如何比较两个文件并输出第一个文件未出现的行?

如何比较两个文件并输出第一个文件未出现的行?

A如果我有一个包含字段列表的文件:

2017-04-23
2017-04-30
2017-05-07
2017-05-14
2017-05-21
2017-05-28
2017-06-04
2017-06-11
2017-06-18
2017-06-25

另一个文件B包含字段列表:

2017-04-23
2017-04-30
2017-05-07
2017-05-14
2017-05-21
2017-05-28
2017-06-04
2017-06-11
2017-06-18
2017-06-25
2017-07-02
2017-07-09
2017-07-16
2017-07-23

我怎样才能快速区分这两个文件,我想知道文件中的所有B字段不是存在于文件中A吗?

这不是常规的 diff,我希望看到文件之间的相对差异,而更像是哈希比较,其中每一行都是映射中的一个条目。我想获取文件中B不存在的所有行的列表A,以便我可以删除它们,其中文件中的每一行A代表要保留的目录。

我正在寻找 Bash/CoreUtils 解决方案。

答案1

如果你的文件已排序,你可以使用通信

$ comm -13 A B
2017-07-02
2017-07-09
2017-07-16
2017-07-23

选项包括:

  • -1 :抑制第 1 列(FILE1独有的行)
  • -3 :抑制第 3 列(在两个文件中都出现的行)

答案2

grep是适合这个工作的工具,尽管它既不是 Bash 也不是 CoreUtils:

grep -Fxvf A B

所有这些选项都符合 POSIX 标准。从man 1 grep

-f pattern_file

从路径名 指定的文件中读取一个或多个模式pattern_file。 中的模式pattern_file应以 结尾。 可以通过 pattern_file 中的空行指定空模式。 除非还指定了-E-F选项,否则每个模式应被视为 BRE,如 POSIX.1-2008 基本定义卷第 9.3 节基本正则表达式中所述。

-F

使用固定字符串进行匹配。将指定的每个模式视为字符串而不是正则表达式。如果输入行包含任何模式作为连续的字节序列,则该行应匹配。空字符串应匹配每一行。

-v

选择不匹配任何指定模式的行。如果-v未指定该选项,则选定的行应为与任何指定模式匹配的行。

-x

仅将使用行中所有字符(终止字符除外)来匹配整个固定字符串或正则表达式的输入行视为匹配行。

答案3

管道的另一种使用方法

cat A B|sort|uniq -u

编辑-UUOC

不需要猫

sort A B|uniq -u

相关内容