1

我有一个奇怪的表演egrep -f

例子:

$ egrep -f ~/tmp/tmpgrep2 orig_20_L_A_20090228.txt | wc -l
3
$ for lines in `cat ~/tmp/tmpgrep2` ; do  egrep $lines orig_20_L_A_20090228.txt ; done | wc -l
12

有人可以给我一个提示可能是什么问题吗?不,文件在执行之间没有改变。egrep 行数的预期答案是 12。

更新文件内容:搜索到的文件包含 cca 13000 行,每行 500 字符长,模式文件包含 12 行,每行 24 字符长。该模式始终(且仅)出现在搜索文件 (26-49) 中的固定位置。

更新模式内容:来自 tmpgrep2 的每个模式都是一个 24 字符长的数字。

4

5 回答 5

2

如果在同一行上找到搜索模式,那么您可以得到您看到的结果:

假设您寻找:

abc
def
ghi
jkl

数据文件是:

abcdefghijklmnoprstuvwxzy

然后一次性命令将打印 1,循环将打印 4。

于 2009-03-06T15:48:47.897 回答
1

您在 ~/tmp/tmpgrep2 中有任何重复项吗?Egrep 只会使用一次欺骗,但您的循环将使用每一次出现。

通过执行以下操作摆脱受骗者:

$ for lines in `sort < ~/tmp/tmpgrep2 | uniq` ; do  egrep $lines orig_20_L_A_20090228.txt ; done | wc -l
于 2009-03-06T20:38:17.717 回答
1

在第二个版本中,读取的行是否包含 shell 正在为您扩展/替换的内容?然后,当 grep 读取模式本身时,它不会完成此操作,从而导致匹配不同的模式发送。

我不完全确定外壳是否在这样的调用中对变量值进行任何扩展,但至少这是一个想法。

编辑:不,它似乎没有做任何替换。但这可能是引用问题,如果您的模式包含空格,则 for 循环将逐步遍历每个标记,而不是遍历每一行。看看read内置的 bash。

于 2009-03-06T15:18:57.640 回答
0

其他人已经提出了我会看的大部分内容。我要检查的下一件事是环境变量 GREP_OPTIONS,或者在您的机器上调用的任何内容。使用干扰环境设置的命令行参数时,我收到了最奇怪的错误消息或行为。

于 2009-03-06T23:02:09.230 回答
0

我第二个@unwind。

你为什么不跑wc -l,看看每次搜索发现了什么?

有可能:

for lines in `cat ~/tmp/tmpgrep2` ; do echo $lines ; done

只是看看现在shell正在处理$lines吗?

于 2009-03-06T15:23:48.940 回答