关于awk:仅当下一行与模式不匹配时才打印与模式匹配的行


Print lines matching a pattern only if the next line does not match the pattern

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

1
awk '!/^O/ {print x}; /^O/ {x=$0}' myfile.txt

不过,这打印的行太多了,包括打印我特别不想打印的行。


未测试。Probz应该工作吗

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

缩短版

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

更多缩短

1
awk '/^O/{x=$0} !/^O/{if(x){print x;x=0;}}' myfile

觉得这是最短的了

1
awk '/^O/{x=$0} !/^O/&&x{print x;x=0;}' myfile

把它们都改了,因为它印错了行。

也让它变短了:)

1
awk 'a=/^O/{x=$0} !a&&x{print x;x=0;}' myfile