パターンファイルに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