【问题标题】:Print lines matching a pattern only if the next line does not match the pattern仅当下一行与模式不匹配时才打印与模式匹配的行
【发布时间】:2014-06-26 21:59:57
【问题描述】:

我想使用 awk 仅在以下行与模式不匹配时打印与模式匹配的行。在这种情况下,模式是行以 O 开头。这是我尝试过的:

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

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

【问题讨论】:

    标签: awk


    【解决方案1】:

    未测试。 应该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
    

    全部更改,因为它打印了错误的行。

    也让它更短:)

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

    【讨论】:

    • 更新后的查询确实解决了我提出的问题。然而事实证明,我面临的问题与我最初想象的有些不同。这是更新后的问题:对于与模式匹配的每组连续行,仅打印第一行。如果有一组 2 个或 3 个或更多以 O 开头的连续行,则只打印这些行中的第一行。一旦遇到与模式不匹配的行,这应该重置状态。在下一组连续的 O 行中,只打印第一行,以此类推。
    • 哦,如果不清楚:如果遇到单独的 O 线,请打印它。因此,总而言之:对于每组 1 个或多个与模式匹配的连续行,打印该组的第一个。
    • 这似乎可以解决问题:awk '/^O/{if(seen==0){seen=1;print $0}} !/^O/{if (seen==1) {seen=0}}'
    • 是的,所有第一组答案都应该适用于此:) 在最后一次编辑之前看看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2019-07-25
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多