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

2番目のバージョンでは、読み取られた行に、シェルが拡張/置換しているものが含まれている可能性がありますか?次に、grepがパターン自体を読み取るときにそれが実行されないため、異なる送信パターンが一致することになります。

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

編集:いいえ、それは何の代用もしていないようです。ただし、パターンに空白が含まれている場合、forループは各行ではなく、各トークンをステップスルーするため、引用符の問題である可能性があります。readビルトインのbashを見てください。

于 2009-03-06T15:18:57.640 に答える
1

~/tmp/tmpgrep2 に重複がありますか? Egrep は dupes を 1 回だけ使用しますが、ループは各オカレンスを使用します。

次のようにして、だまされた人を取り除きます。

$ 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 に答える
0

他の人たちは、私が見ることのほとんどをすでに思いついています。次に確認するのは、環境変数GREP_OPTIONS、またはマシンで呼び出されるものです。環境設定に干渉するコマンドライン引数を使用すると、最も奇妙なエラーメッセージまたは動作が発生します。

于 2009-03-06T23:02:09.230 に答える
0

2番目に@unwindします。

wc -lなしで実行して、各検索で何が検出されているかを確認してみませんか?

そして多分:

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

シェルが処理していることを確認するだけ$linesですか?

于 2009-03-06T15:23:48.940 に答える