2009-03-06 12 views
1

私は奇妙なことにegrep -fを持っています。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)の固定位置で発生します。

UPDATE onパターンの内容:tmpgrep2のすべてのパターンは、長さが24文字です。

+0

最終回の終了日時行にコマンドラインプロンプトが表示されていますか?もしそうなら、質問で転記した内容を '$'(bashなど)または '%'(Cシェルの場合)または '#'だけに制限してrootとして作業することをお勧めします。 –

答えて

1

2番目のバージョンでは、読み込まれた行にシェルが展開/置換するものが含まれていることがありますか?そして、それはパターン自体を読むときにgrepによって行われないので、一致するパターンが送られてきます。

シェルがそのような呼び出しで変数値を拡張しているかどうかは完全にはわかりませんが、それは少なくとも考え方です。

EDIT:いいえ、置き換えられないようです。しかし、あなたのパターンに空白が含まれている場合は、forループが各行を通過するのではなく、各トークンを通過するという問題を引用することができます。組み込みのreadのbashを見てください。

+0

これは考えられる原因(+1)である可能性がありますが、この場合はパターンの更新を参照してください。 –

0

I second @unwind。

wc -lなしで実行し、各検索で何が見つかりましたか。

そしておそらく:

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

ちょうど今、シェルが$linesを処理している参照するには?

+0

私はそうしました。 wc -lはちょうどそれが奇妙に動作することを示すために追加されました。 –

2

検索パターンが同じライン上で発見された場合、その後、あなたはあなたが見る結果を得ることができます:

は、あなたが探しているとします

abc 
def 
ghi 
jkl 

とデータファイルは次のとおりです。

abcdefghijklmnoprstuvwxzy 

ワンタイムコマンドは1を出力し、ループは4を出力します。

+0

問題の原因(+1票)ですが、そうではありません。パターンがどこで発生する可能性があるかについての私の更新を見てください。 –

+0

その後、システムからwcを取り出して、raw形式のegrepの結果を見てください。行番号を報告するには、-nオプションを使用することもできます。あなたはたった12行の出力しか得られないので、あまりにも悪くはありません。長い線が短くなるように 'cut -c1-70'を使うことができます。 –

+0

一致するデータに正規表現のメタキャラクタがありますか?それも物事を混乱させる可能性があります。しかし、あなたはおそらく、2つの別々の結果セットの手動分析を残しています。 FWIW:最後に考えるべきことは、 'bug in egrep'です。それはほとんどありそうもありません。 –

1

〜/ tmp/tmpgrep2の重複はありますか? Egrepはdupesを1回だけ使用しますが、ループはそれぞれの発生を使用します。

はこのような何かを行うことによってdupesを取り除く:

$ for lines in `sort < ~/tmp/tmpgrep2 | uniq` ; do egrep $lines orig_20_L_A_20090228.txt ; done | wc -l 
+0

+1これは原因である可能性がありますが、私の場合はそうではありません。私のパターンファイルに重複はありません。 –

0

他の人がすでに、私が見てしまうもののほとんどが出ています。次にチェックするのは、環境変数GREP_OPTIONSか、それがあなたのマシン上で呼び出されたものです。私は、環境設定を妨害したコマンドライン引数を使用すると、最も奇妙なエラーメッセージや動作を得ました。