2017-08-24 7 views
-1

次のAwkコードは、/^[+] {3} /と/^$ /の2つのパターンの間でgrep-diff.logファイルをチャンクします。間にスペースを入れて改行を取り除く。チャンク中にAWK​​がハングする

これは動作しますが、最近ハングアップしてデバッグできません。

これをより効率的に行う方法に関するヒントや覚えがあれば歓迎されます。コメントへの

awk -v g=0 '{if ($0 ~ /^[+]{3}/) {chunk=$0 } 
else if ($0 ~ /^$/) {chunkAry[g]=chunk; chunk=""; g+=1} 
else {chunk=chunk " " $0}} 
END {chunkAry[g]=chunk; chunk=""; 
for (c in chunkAry) print "Chunk : ",c, " " chunkAry[c]}' $(pwd)/grep-diff.log > "$(pwd)/chunked-diff.log" 

返信ずっとapprecicatedヘッドアップエドのための1人の

おかげで、。

私はあなたのアドバイスを受け取り、配列を取り除き、デバッグ行を追加しましたが、スクリプトはエラーなしで停止します。

ここ改訂コードである -

awk -v g=0 '{if ($0 ~ /^[+]{3}/) {chunk=$0 } 
else if ($0 ~ /^$/) {print "Chunk ",g," : ",chunk; chunk=""; g+=1} 
else {chunk=chunk " " $0}} 
END {print "Chunk ",g," : ",chunk; chunk=""; print "Here : " | "cat>&2"}' $(pwd)/grep-diff.log > "$(pwd)/chunked-diff.log" 

"これは" 正規表現/ ^との間のすべての行を取ることである[+] {3} /と/^$ /パターンを含め、すべての改行の発生を除去するには出力ファイルに保存します。

入力ファイルgrep-diff.logは90 MBです。 Awkは、合計276のうち256番目のオカレンスでハングします。ハングするテキストのチャンクは80 KBですが、ファイルの最大チャンク以外のサイズの異常はありません。完全な80 KBのチャンクは1727個のファイル行を持ち、Awkは1718行目でハングします。

Awkのバッファサイズ制限は設定できますか?先週、Node JSと同様のことが起こりました。そこでは手動のバッファ制限のサイズが増えて問題が解決されました。

更新

私は、スクリプトがハングアップする原因となったチャンクを切り出し、スクリプトがまだ256番目の発生時にハングアップするもの、と思います。新しい256番目のチャンクは小さいので、チャンクサイズではありません。何ができるのでしょうか?

+0

ここに 'print 'を追加したのですか?到達しているかどうかを確認するには、ENDセクションの最初に "cat>&2"を入力します。スクリプトがハングアップする唯一の方法は、入力ファイルがハングした場合、つまり何も書き込まれていない状態で開いている場合です。そこで、grep-diff.logを作成しているものを調べ、そのデバッグ用のprint文を追加して、ENDに決して到達せず、次回このスクリプトがハングすることを確認するgrep-diff.logに書き込むプロセスを終了して、他のスクリプトをデバッグします。 –

+0

とwrt 'これをより効率的にする方法'それは 'this'が何であるかに依存します(例えば、今では配列をまったく使っていない理由があるようですが、 ) - 簡潔でテスト可能なサンプル入力とそれに役立つ期待出力を追加します。 –

答えて

0

Mac OS X 10.12.6でこのスクリプトを実行していたことを忘れてしまったので、使用しているawkツールはGNUではありません。その後、brew(brew install gawk)を使ってGNU Gawkをインストールし、同じコードを実行しましたが、gawkのキーワードawkを変更しました。スクリプトはエラーなく実行されます。

関連する問題