2017-08-24 3 views
-1

der folgende Awk-Code chunks die Datei grep-diff.log zwischen den beiden Mustern/^ [+] {3}/und/^ $ /. Entferne Zeilenumbrüche dazwischen mit Leerzeichen.AWK hängt beim Chunking

Das funktioniert, aber vor kurzem hat es zu hängen und ich kann es nicht debuggen.

Alle Tipps oder Tricks, wie dies effizienter zu tun wäre, würden begrüßt.

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" 

Antworten auf Kommentare 1

Vielen Dank für das Heads-up Ed, viel apprecicated.

Ich habe Ihren Rat genommen und das Array losgeworden und die Debug-Zeile hinzugefügt, aber das Skript hängt immer noch ohne Fehler. Hier

ist die überarbeitete Code -

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" 

Das "this" ist, alle Linien nehmen zwischen regex/^ [+] {3}/und/^ $/inklusive Muster und entfernen Sie alle Zeilenumbrüche Vorkommen und in der Ausgabedatei speichern.

Die Eingabedatei grep-diff.log ist 90 MB. Awk hängt beim 256. Vorkommen von insgesamt 276. Der Textblock, an dem es hängt, ist 80 KB, aber es gibt keine Anomalien, außer dass seine Größe bei weitem der größte Teil in der Datei ist. Der volle 80 KB Chunk hat 1727 Dateizeilen, Awk hängt an Zeile 1718, wo es nichts Seltsames gibt.

Hat Awk eine Puffergrößenbeschränkung, die eingestellt werden kann? Etwas Ähnliches passierte letzte Woche mit Node JS, wo eine Erhöhung des manuellen Pufferlimits das Problem behob.

aktualisiert

schnitt ich den Brocken heraus, dass das Skript, zu hängen verursacht wurde und erraten, was das Skript auf dem 256. Auftreten hängt noch. Der neue 256. Chunk ist winzig, also ist es nicht die Chunk-Größe. Hmmm, was könnte es sein?

+0

Ist es Ihnen aufgefallen, hier einen "Ausdruck" hinzuzufügen? | "cat> & 2" 'am Anfang des END-Abschnitts, um zu sehen, ob es erreicht wird? Das Skript kann nur hängen bleiben, wenn die Eingabedatei hängt, d. H. Geöffnet bleibt und nichts anderes darauf geschrieben wird. Schauen Sie sich also an, was grep-diff.log erstellt, fügen Sie diese Debug-Anweisung hinzu, um zu bestätigen, dass das END nie erreicht wird und das nächste Mal, wenn dieses Skript aufhört den Prozess zu beenden, der in grep-diff.log schreibt Debugging dieses andere Skript. –

+0

und "Wie geht das effizienter?" Hängt alles davon ab, was 'this' ist (zB im Moment scheint es keinen Grund für Sie zu geben, ein Array zu verwenden, aber Sample Input/Output würde dies aufheben) - fügen Sie prägnante, testbare Beispieleingabe und erwartete Ausgabe hinzu, um dabei zu helfen. –

Antwort

0

Ich habe vergessen zu erwähnen, dass ich dieses Skript auf Mac OX 10.12.6 ausgeführt habe, also ist das verwendete awk-Tool nicht GNUs. Anschließend habe ich GNU Gawk mit brauen (brew install gawk) installiert und den gleichen Code ausgeführt, aber das Keyword awk für gawk geändert. Jetzt wird das Skript ohne Fehler ausgeführt.