2012-05-07 11 views
0

私は2.txtの1.txtで "grep"を使っていくつかのパターンを探しています。次に、いくつかの操作を行います。 しかし、 "grep"は大きなテキストでは遅すぎるようです。gretへの代替

for ((i=1; i<=236410; i++)) 
do 
    head -$i 1.txt|tail -1|grep -f - 2.txt|awk '{mul+=$4*$7} END {print $1,$2,$3,mul}' 
done > file1 

私には別の方法がありますか?思わawk/sedはこれを行うことができますが、ちょうど変数AWKにhead -$i 1.txt|tail -1またはTHX

+1

あなたの 'head' /' tail'コンボは遅いですものです。 – tripleee

+0

はい、どうして全部ではなく、一度に1行ずつ行っていますか? – Kevin

+0

どうすればいいのですか? – user815408

答えて

1

は、入力の量を扱うことができるgrepを想定して、あなたのパターンファイルは、236410行を持っていると仮定すると、sedはどのようにパイプがわからない、とメモリが問題であり、あなたの入力は静的な文字列である場合は、代わりにfgrepで試すには、出力ファイルの順序は重要ではありません理由だけで

grep -f 1.txt 2.txt | awk ... >file1 

をしないと仮定すると、より多くのパターンを扱うことができます。実際に出力の順序が重要な場合は、このような処理が非常に高速になるはずです。

while read line; do 
    grep "$line" 2.txt | awk ... 
done <1.txt >file1 

入力に応じて、あなたはバックスラッシュなど、IFSでマックおよび/または空白文字を処理するためにreadにいくつかのオプションを追加することもでき

あなただけの入力の236410の最初の行をしたい場合は、これを次のように変更することができます

head -n 236410 1.txt | 
while read line ... 

上記のいずれにも該当しない場合は、別のアイデアがあります。とにかく、実際の処理のためにawkを使用しているので、あなたはawkスクリプトに処理のすべてをリファクタリング、またはその場でsedスクリプトを作成し、awkにその出力を渡すことができるかもしれません。これは少し関与し、もう一度パターンがどのように見えるかに依存しますが、このようなものは、あなたのアイデアを与える必要があります。

sed 's%.*%/&/p%' 1.txt | less 

何を見ていることは試合がそれぞれの上にあるかどう印刷さsedスクリプトです1.txtのパターンの(パターンにスラッシュが含まれていれば壊れてしまいますが、別の区切り文字を使用するか、パターン内のすべてのスラッシュをエスケープしてください)。これをファイルに保存するか、またはsedが標準入力)sedの2番目のインスタンスに渡し:

sed 's%.*%/&/p%' 1.txt | sed -f - -n 2.txt | less 

そして、それはあなたがawkに渡すものです:

sed 's%.*%/&/p%' 1.txt | sed -f - -n 2.txt | awk ... >file1