反向匹配的异常 grep 行为

Deviant grep behavior for Inverse matching

我有一个包含标识符(每行一个)的文件,我希望通过未指定的分析运行。如果一切 运行 完美,分析将输出另一个具有相同标识符的列表(不一定以相同的顺序)。

但是,事实证明,某些输入标识符未进行分析,并且这些标识符不存在于输出文件中。这是因为 Internet 连接中断,所以程序跳过了一些标识符,并在 Internet 恢复时成功地继续向下移动。这意味着被跳过的标识符散布在输入文件中。

因此输入文件中会有一些输出文件中不存在的行,我想提取这些行并 re-run 我的分析。这听起来像是一个简单的 grep -vf 命令,但这里有点令人困惑。

我知道我的输入文件有 100000 行。我也知道我的输出文件有 9000 行。合理的差异应该是 100000-90000 = 10000 个标识符。但是当我 运行

fgrep -vf output input | wc-l

我得到的是 9990 而不是 10000。所以在某个地方,有 10 个标识符丢失了。我已经检查过问题是否是由于 Windows EOF 或制表符引起的(因此之前 grep 有其他类型的意外行为),但这不是问题所在。我的 headers 包含大小写字母、数字和下划线,但没有其他字符 e。 g.

Si_d14LSK_TRRt_Pmkk_comp10_c0_seq2

标识符的输出列表是通过

生成的
ls -lh dir | sed "1d" | sed "/.* //" | sed "s/.xml//" > output

分析的前一步为每个输入标识符生成了一个文件。

有谁知道任何可能导致这种异常 grep 行为的上下文因素(如 EOF)?或者建议另一种方法来解决这个问题而不是 fgrep -vf?

我正在使用 Ubuntu 12.04.4 LTS 和 GNU grep 2.10。

您的 "output" 标识符可能与 "input" 文件的子字符串相匹配。例如,"output" 包含 foo,"input" 包含 foofoobar

你想要

之一
grep -Fvxf output input   # match a whole line
grep -Fvwf output input   # match a whole word
# ......^