sed 或 grep 与 vfF 的其他等效项

sed 或 grep 与 vfF 的其他等效项

RHEL6.10、gnu grep 2.2

grep -vfF stem.txt source.txt > filteredoutput.txt

stem.txt有唯一的 13 位数字。

source.txt是固定长度 (400) 数据文件,其中 13 位字段值从位置 225 开始。字段值在文件中是唯一的。在这两种情况下,换行符都是行分隔符。

source.txt大约有 80k 行,stem.txt大约 4.5k

然而,我的输出文件有大约 75k 行,这意味着它过滤的内容比茎文件中的内容多。

我不明白为什么会发生这种情况。

在故障排除时,我用空格替换了每行中source.txt除数字字段之外的所有其他内容,然后它给出了正确的结果。非常令人困惑的行为。

  1. 不知道我该如何解决?
  2. 我的其他选项是什么 -sed /awk 等效项。

编辑: grep 万岁!问题出在用户/我身上。由于疏忽,我没有考虑到源文件中其他地方可能出现的 13 位特殊序列的可能性。 grep 命令及其参数按预期工作。

答案1

使用awk,确保您只在这些字符串应该在的地方查找它们。

awk '!source {stem[$0]; next}
     ! (substr($0, 225, 13) in stem)
     ' stem.txt source=1 source.txt > filteredoutput.txt

substr()起始位置从 1 开始)。

这也将使其更加高效,因为它只需要每行执行一次哈希查找,source.txt而不是 4.5k 次子字符串查找。

注意

grep -vfF stem.txt source.txt

grep -v -f F stem.txt source.txt

(查找文件中不匹配任何正则表达式stem.txt的行)。source.txtF

你的意思可能是:

grep -vFf stem.txt source.txt

(查找source.txt不包含 中任何字符串的行stem.txt)。

答案2

另一种方法是动态创建 ERE,在 、 的帮助下从第 225 个位置开始匹配,sed对于grep这些 ERE:

grep -vEf <(sed 's/.*/^.{224}&/' stem.txt) source.txt

因此,匹配需要从特定位置开始,以防止随机位置中任何其他可能的匹配影响输出。

grep您还可以通过运行without-v并将结果与​​ 进行比较来测试其他位置是否有匹配项stem.txt

相关内容