パターンファイルに236,410行があり、grep
その量の入力を処理できると仮定し、出力ファイルの順序が重要でないと仮定すると、なぜそうしないのですか?
grep -f 1.txt 2.txt | awk ... >file1
メモリが問題であり、入力が静的文字列である場合は、fgrep
代わりに試してみてください。大量のパターンを処理できます。出力の順序が実際に重要である場合、このようなものははるかに高速であるはずです。
while read line; do
grep "$line" 2.txt | awk ...
done <1.txt >file1
入力に応じて、空白やバックスラッシュなどを処理するためIFS
のオプションをいじったり、追加したりすることができます。read
入力の最初の236,410行のみが必要な場合は、これを次のように変更できます。
head -n 236410 1.txt |
while read line ...
上記のどれもあなたに合わない場合は、ここに別のアイデアがあります。awk
とにかく実際の処理に使用しているので、すべての処理をawk
スクリプトにリファクタリングしたり、その場でスクリプトを作成してsed
その出力をに渡すことができる場合がありますawk
。これは少し複雑で、パターンがどのように見えるかに依存しますが、このようなものはあなたにアイデアを与えるはずです:
sed 's%.*%/&/p%' 1.txt | less
見ているのは、sed
の各パターンに一致する場合に出力するスクリプト1.txt
です。(パターンにスラッシュが含まれていると壊れます。些細な場合は、別の区切り文字を使用するか、パターン内のすべてのスラッシュをエスケープしてください。)これで、ファイルに保存できます。または(sed
標準でスクリプトを処理できる場合) input) 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