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