反向匹配的偏差grep行为

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

但是,事实证明,没有对某些输入标识符进行分析,并且这些标识符不存在于输出文件中.这是因为互联网连接失败了,因此程序跳过了一些标识符,并在互联网恢复时继续成功进一步下载.这意味着跳过的标识符散布在输入文件中.

因此输入文件中会有一些输出文件中没有的行,我想提取这些并重新运行我的分析.这听起来像一个简单的grep -vf命令,但这里有点令人困惑.

我知道我的输入文件有100000行.我也知道我的输出文件有9000行.差异应合理地为100000-90000 = 10000个标识符.但是当我跑步的时候

fgrep -vf output input | wc-l

我得到9990而不是10000.所以某处,有10个标识符丢失了.我已经检查过问题是由于Windows EOF或标签引起的(由于这个原因,grep之前还有其他类型的意外行为),但这不是问题.我的标题包含大小写字母,数字和下划线,但没有其他字符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”包含foo,“input”包含foo和foobar

你想要一个

grep -Fvxf output input   # match a whole line
grep -Fvwf output input   # match a whole word
# ......^
点赞