0

「」を使用して、2.txtから1.txtのパターンを探していgrepます。次に、いくつかの操作を行います。ただし、「grep」は大きなテキストには遅すぎるようです。

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またはsedawk/sedにパイプする方法がわかりませんhead -$i 1.txt|tail -1

どうも

4

1 に答える 1

1

パターンファイルに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
于 2012-05-07T15:02:54.763 に答える