Awk 仅当下一行与图案不匹配时,才打印与图案匹配的行

Awk 仅当下一行与图案不匹配时,才打印与图案匹配的行,awk,Awk,我想使用awk打印与模式匹配的行,但前提是以下行与模式不匹配。在这种情况下,模式是线以O开始。这就是我所尝试的: awk '!/^O/ {print x}; /^O/ {x=$0}' myfile.txt 但这会打印太多的行,包括打印我特别不想打印的行。未测试。 probz应该工作吗 awk '/^O/{if(seen==0){seen=1};c=$0} !/^O/{if (seen==1) {print c; seen=0;}}' myfile.txt 缩略版 awk '/^O/{x=

我想使用awk打印与模式匹配的行,但前提是以下行与模式不匹配。在这种情况下,模式是线以O开始。这就是我所尝试的:

awk '!/^O/ {print x}; /^O/ {x=$0}' myfile.txt 
但这会打印太多的行,包括打印我特别不想打印的行。

未测试。 probz应该工作吗

awk '/^O/{if(seen==0){seen=1};c=$0} !/^O/{if (seen==1) {print c; seen=0;}}' myfile.txt
缩略版

 awk '/^O/{x=$0} !/^O/{if(x!=0) {print x; x=0;}}' myfile.txt
更短

awk '/^O/{x=$0} !/^O/{if(x){print x;x=0;}}' myfile
我认为这是最短的

awk '/^O/{x=$0} !/^O/&&x{print x;x=0;}' myfile
因为打印了错误的行,所以全部更改了

也让它变短了:)


更新后的查询确实解决了我提出的问题。然而,事实证明,我面临的问题与我最初的想法有些不同。下面是更新后的问题:对于与图案匹配的每组连续线条,只打印第一条。如果有一组2行、3行或更多以O开头的连续行,则只打印其中的第一行。一旦遇到与模式不匹配的行,应重置状态。在下一组连续的O行中,只打印第一行,以此类推。哦,如果不清楚:如果遇到单独的O行,请打印它。总之,对于与模式匹配的一组或多组连续行,打印组中的第一行。这似乎可以做到:
awk'/^O/{if(seen==0){seen=1;print$0}/^O/{if(seen==1){seen=0}}
Yep所有第一组答案都应该适用:)只需在最后一次编辑之前查看
awk 'a=/^O/{x=$0} !a&&x{print x;x=0;}' myfile