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
除数字字段之外的所有其他内容,然后它给出了正确的结果。非常令人困惑的行为。
- 不知道我该如何解决?
- 我的其他选项是什么 -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.txt
F
你的意思可能是:
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
。