2017-08-24 203 views
-1

以下Awk代碼將兩個模式/^[+] {3} /和/^$ /之間的文件grep-diff.log分塊。用空格刪除中間的換行符。AWK在Chunking掛起時掛起

這有效,但最近它已經開始掛起,我無法調試它。

如何更有效地做到這一點的任何提示或技巧將受到歡迎。

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" 

回覆評論1

感謝擡頭版,多apprecicated。

我已經採取了你的建議,擺脫了陣列,並添加了調試線,但腳本仍然掛起沒有錯誤。

這裏是修改後的代碼 -

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的任何內容,添加該調試打印語句以確認END永遠不會到達,並且下次該腳本掛起時會終止正在寫入grep-diff.log的進程以查看此腳本完成,然後啓動調試其他腳本。 –

+0

and wrt'如何更有效地做到這一點'這一切都取決於'this'是什麼(例如,現在似乎沒有任何理由讓你使用一個數組,但樣本輸入/輸出將清除) - 添加簡潔,可測試的樣本輸入和預期輸出以獲得幫助。 –

回答

0

我忘了提及我在Mac OX 10.12.6上運行這個腳本,所以使用的awk工具不是GNU的。隨後,我使用brew(brew install gawk)安裝了GNU Gawk,並運行相同的代碼,但更改了gawk的關鍵字awk。現在腳本執行沒有錯誤。