Как напечатать строку с шаблоном, который является ближайшим к другой линии с определенным шаблоном? - PullRequest
2 голосов
/ 10 августа 2010

Я хочу найти шаблон, ближайший к конкретному шаблону. Например, я хочу напечатать "bbb =", который находится под "yyyy:" (это самая близкая строка с bbb ​​= to yyyy) Это строка 8. Номера строк и порядок может быть изменен, поэтому лучше не использовать номера строк.

root # vi 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?

Ответы [ 2 ]

1 голос
/ 10 августа 2010

Как то так?

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

Или строка выше тоже может соответствовать? В таком случае, возможно:

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)
}
0 голосов
/ 10 августа 2010

Быстро и грязно, используя grep:

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