【发布时间】: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中的所有行。