awk вывести совпадающую строку и строку перед соответствием - PullRequest
6 голосов
/ 03 февраля 2011

Вот что я пытаюсь сделать с помощью awk. Получите строку, которая соответствует регулярному выражению, и строку непосредственно перед совпавшим и напечатайте. Я могу получить строку, которая соответствует регулярному выражению, но не строку непосредственно перед этим:

awk '{if ($0!~/^CGCGGCTGCTGG/) print $0}' 

Ответы [ 6 ]

11 голосов
/ 03 февраля 2011

В этом случае вы можете легко решить это с помощью grep:

grep -B1 foo file

Однако, если вам нужно использовать awk:

awk '/foo/{if (a && a !~ /foo/) print a; print} {a=$0}' file
2 голосов
/ 03 февраля 2011
/abc/{if(a!="")print a;print;a="";next}
{a=$0}
1 голос
/ 26 марта 2016

Я создал следующий скрипт awk.Печатает совпадающую строку, а также предыдущие 2 строки.Вы можете сделать это более гибким из этой идеи.

search.awk

{
    a[0]=$0;
    for(i=0;i<2;i++)
    {
       getline;
       if(i==0){
            a[1]=$0;
       }
       if(i==1){
            if($0 ~ /message received/){
                print a[0];     
                print a[1];
                print $0;
            }
       }
    }
}

Использование:

awk '{print $0}' LogFile.log | awk -f search.awk
0 голосов
/ 16 октября 2013

Возможно, немного не по теме, но я использовал ответ от belisarius, чтобы создать свой вариант решения, приведенного выше, который ищет запись Nth и возвращает эту и предыдущую строку.

awk -v count=1 '/abc/{{i++};if(i==count){print a;print;exit}};{a=$0}' file
0 голосов
/ 29 июня 2013

используйте более простой поиск по шаблону

gawk '{if (/^abc$/) {print x; print $0};x=$0}' file1 > file2

0 голосов
/ 03 февраля 2011

Почему бы не использовать grep -EB1 '^CGCGGCTGCTGG'

awk, чтобы сделать то же самое, очень затянуто, см. Ответ Марко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...