Op zondag 2 maart 2014 12:50:40 schreef Geert Stappers: > Hoi, > > Een programma verwerkt een lijst. > Doet dat goed, de output is minder. > > <output> > Setup info foo > Setup info bar > Processing data 1 > Processing failed > Processing data 2 > Processing failed > Processing data 3 > Processing failed > Processing data 4 > Processing failed > Processing data 5 > Processing failed > Processing data 6 > Processing failed > <knip/> > Processing data n > Processing failed > Processing data n+1 > Processing failed > Processing data n+2 > Processing failed > Processing data n+3 > Processing failed > Processing data n+4 > Result: asdfadf > Result: asdasferqwe > Result: askjkqerqr > Processing data n+5 > Processing failed > Processing data n+6 > Processing failed > Processing data n+7 > Processing failed > Processing data n+8 > Processing failed > <knip/> > Processing data n+m > Processing failed > Processing data n+m+1 > Processing failed > Processing data n+m+2 > Processing failed > Final statistics > </output> > > > Wat ik zou willen hebben, is > <output> > Setup info foo > Setup info bar > Processing data n+4 > Result: asdfadf > Result: asdasferqwe > Result: askjkqerqr > Final statistics > </output> > > Dus dat "kopregels" met "Processing data recordnummer" niet getoond worden > als de processing is mislukt. De regels met "Processing failed" zijn ook > niet nodig. > > Met sed en/of awk krijg ik het niet voormekaar.
Met awk zou dat toch moeten lukken, en is redelijk simpel:
commando | awk ' /Processing data/{ header=$0; header_printed=0; } /Result/{ if(!header_printed) { print header; header_printed=1; } print $0; }'
Je mag dat eventueel op één lijn zetten, maar zo leest het wat makkelijker.
Eerste code block wordt uitgevoerd op een lijn 'Processing data', en bewaart die lijn ("$0") in de variabele 'header'. De variabele 'header_printed' wordt op 0 gezet ('false').
Het tweede code block wordt uitgevoerd op een lijn 'Result:', en kijkt eerst of 'header_printed' op 0 staat. Zo ja, dan wordt de opgeslagen header uitgevoerd, en de variabele 'header_printed' op 1 ("true"). Daarna voeren we de huidige lijn gewoon uit.
Voor een lijn "Processing failed" is er geen code block, en is er dus ook geen uitvoer.
Wat mist nog: "Setup info" en "Final statistics". Dat lijkt een mooie oefening voor de lezer ;-)
-- This end should point toward the ground if you want to go to space.
If it starts pointing toward space you are having a bad problem and you will not go to space today.
-- http://xkcd.com/1133/
|