5

grep、またはgrepのようなツールに関するヘルプを探しています。これには、grep、egrep、awk、sed、または一致の検索に使用されるその他のツールが含まれますが、これらに限定されません。しかし、残りの質問では、これをgrepと呼びます。

一致するファイルをgrepする最速の方法を探しています。また、一致するファイルをgrepし、一致する行の残りの部分ではなく、その行番号のみを返す最速の方法も探しています。構文が高速である限り複雑であってもかまいません。プログラムで使用するつもりですが、複雑さは問題ではありません。

パターンを正規表現する必要がある場合にもこのメソッドが機能する必要があるため、範囲を検索することもできます。したがって、コマンドがデフォルトでサポートしている場合、または正規表現が必要な場合に10未満のすべての数値を検索する必要がある場合は、見つけることができる最速の方法を探しています。

ありがとうございました。

編集

私が扱っているファイルは非常に大きくなります、私のテストファイルは1.9GBです

4

5 に答える 5

6

KingsIndianは-mgrepのオプションで目標を達成していると思いますが、速度が主な目標である場合は、この特定の使用法cutよりも速い可能性があります。awk試す:

grep -n -m 1 regex file | cut -d: -f1

-d:引数は、コロンをフィールド区切り文字として使用するようにcutに指示しますが、引数-f1は、最初のフィールドのみを出力するように指示します。

于 2012-09-17T16:37:18.653 に答える
3

最初の試合後に停止するには:

grep -n -m 1 str file | awk -F: '{print $1}'

の引数値をm別の値に変更して、その多くの一致後に停止することができます。そのawk部分は、行番号のみを取得することです。

5試合後に停止するには:

grep -n -m 5 str file | awk -F: '{print $1}'

編集:
あなたはtailそのために使うことができます。たとえば、最初の5つの一致をスキップして、次の7つを出力するには:grep -n -m 12 str file| tail -7 | awk -F: '{print $1}'

于 2012-09-16T23:50:08.803 に答える
1

を使用してパターンマッチングを実行GNU awkし、行番号を印刷するだけです。

awk '/regex/ { print NR }' file.txt

値がスペースで区切られていると仮定すると、行に10未満の数値が含まれている場合、行番号を見つけることができます。

awk '{ for (i=1; i<=NF; i++) if ($i <= 10) print NR }' file.txt

ただし、これにより、10未満の数値が出現するたびに行番号が出力されます。これは望ましくない場合があると思います。したがって、一致ごとに複数の重複する行番号を削除するには、配列を使用できます。

awk '{ for (i=1; i<=NF; i++) if ($i <= 10) array[NR]++ } END { for (i in array) print i }' file.txt

ソートされた出力が必要な場合は、にパイプしsort -nます。よりエレガントなソリューション(つまり、配管なし)を好む場合:

awk '{ for (i=1; i<=NF; i++) if ($i <= 10) array[NR]++ } END { for (j in array) sorted[k++]=j+0; n = asort(sorted); for (j=1; j<=n; j++) print sorted[j] }' file.txt

編集:

上記の最後の3つのawkコマンドのいずれかで、に変更if ($i <= 10)するだけで、 if ($i >= 11 && $i <= 20)11から20までの結果が表示されます。

于 2012-09-17T01:17:34.033 に答える
1

これが速いかどうかはわかりませんが、これは機能しているようです。

nl -b a "<filename>" | grep "<phrase>" | awk '{ print $1 }'
于 2012-09-16T23:52:02.743 に答える
1

フォーク以外のsed呼び出しでいくつかのテストを行ったところ、幸運ではありませんでしたが、ここで参照できるように、1ギガバイトのテキストファイルを使用した数値を参照してください。ここで、$PATTERNは最後の行の一部です。

(ネタバレ:grepはこの操作で5倍以上速く、awkは最も遅い)

user @ box:〜$ ls -lh / dev / shm / test
-rw-r--r--1ユーザーuser979MJul 8 09:50 / dev / shm / test
user @ box:〜$ sed --version | ヘッド-n1
GNUsed-バージョン4.2.1
user @ box:〜$ time sed -n "/ $ PATTERN / {=; q}" / dev / shm / test
206558

実数0分6.835秒
ユーザー0m6.160s
sys 0m0.648s
user @ box:〜$ grep -V | ヘッド-n1
grep(GNU grep)2.14
user @ box:〜$ time grep -n -m 1 "$ PATTERN" / dev / shm / test | カット-d:-f1
206558

実数0分1.337秒
ユーザー0m0.592s
sys 0m0.736s
user @ box:〜$ awk --version | ヘッド-n1
GNU Awk 4.0.1
user @ box:〜$ time awk "/ $ PATTERN / {print NR}" / dev / shm / test
206558

実数0分7.176秒
ユーザー0m6.356s
sys 0m0.776s

于 2015-07-08T07:58:32.963 に答える