【问题标题】:Deviant grep behavior for Inverse matching反向匹配的异常 grep 行为
【发布时间】:2015-04-28 12:27:57
【问题描述】:

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

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

所以输入文件中会有一些输出文件中不存在的行,我想提取这些行并重新运行我的分析。这听起来像是一个简单的 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

标识符的输出列表是通过doing生成的

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

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

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

我在 Ubuntu 12.04.4 LTS 上使用 GNU grep 2.10。

【问题讨论】:

  • 总是有 awk 方法来解决这个问题:awk 'FNR==NR {a[$0]; next} !($0 in a)' fileA fileB。这显示了fileB 中没有出现在fileA 中的所有行。

标签: grep inverse


【解决方案1】:

您的“输出”标识符可能与“输入”文件的子字符串匹配。例如,“输出”包含foo,“输入”同时包含foofoobar

你想要一个

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

【讨论】:

  • 这效果非常好!我的一些以 e 结尾的标识符。 G。 seq1 可能很好地匹配与近端相同但以 seq12 或类似结尾的标识符。
猜你喜欢
  • 2011-08-05
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2020-09-17
  • 1970-01-01
  • 2017-05-30
相关资源
最近更新 更多