【问题标题】:How to print a line with a pattern which is nearest to another line with a specific pattern?如何打印具有最接近具有特定图案的另一条线的图案的线?
【发布时间】:2011-03-27 19:24:24
【问题描述】:

我想找到最接近特定模式的模式。比如我想打印“yyyy:”下面的“bbb=”(它是bbb=到yyyy的最接近的行)。这是第8行。行号,顺序可能会改变,所以最好不要使用行号。

root# vi a
"a" 15 行

 1  ## xxxx:

 2  aaa=3

 3  bbb=4

 4  ccc=2

 5  ddd=1

 6  ## yyyy:

 7  aaa=1

 8  bbb=0

 9  ccc=3

10  ddd=3

11  ## zzzz:

12  aaa=1

13  bbb=1

14  ccc=1

15  ddd=1

您有使用 awk 或 grep 来实现此目的的想法吗?

【问题讨论】:

  • 如果对“最接近模式”的含义没有一个清晰的概念,这并不是一个真正的问题......

标签: unix find awk grep


【解决方案1】:

这样的?

awk '/^## yyyy:/ { i = 1 }; i && /^bbb=/ { print; exit }'

或者上面的一行也可以匹配 if 吗?在那种情况下,也许:

罢工>

awk '/^bbb=/ && !i { p=NR; s=$0 }; /^bbb=/ && i { print (NR-i < i-p) ? $0 : s; exit }; /^## yyyy:/ { i=NR }'

考虑到可能没有上一个或下一个条目:

/^bbb=/ && !i { p1 = NR; s1 = $0 }
/^bbb=/ &&  i { p2 = NR; s2 = $0; exit }
/^## yyyy:/ { i = NR }
END {
    if (p1 == 0)
        print s2
    else if (p2 == 0)
        print s1
    else
        print (i - p1 < p2 - i ? s1 : s2)
}

【讨论】:

    【解决方案2】:

    使用grep 又快又脏:

    grep -A 100 '##yyyy' filename | grep 'bbb='
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-16
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多