2011-02-03 4 views
5

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

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

Позволяет предположим, что линии 3 и 4 совпадают с регулярным выражением. вы хотите, чтобы 2,3,4 появлялись? –

ответ

10

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

grep -B1 foo file 

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

awk '/foo/{if (a && a !~ /foo/) print a; print} {a=$0}' file 
+0

Как насчет awk '{if ($ 0 ~ /> /) head = $ 0; getline} {if ($ 0 ~/^ CGCGGCTGCTGG /) print head "\ n" $ 0}' .. это правильно? – Sudeep

+0

@Sudeep: Вы можете сказать себе, правильно ли это, протестировав его ... но дольше и труднее понять, чем предложение marco, так зачем беспокоиться? – Cascabel

+0

Спасибо, Джероми, да, я могу проверить ... Я, но getline был немного запутанным, вот почему я отправил, чтобы увидеть, кто-то видит команду и может поднять флаг :) – Sudeep

0

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

awk сделать то же самое очень долго, см. Ответ Марко.

+0

Спасибо Marco и Solmojo..grep работает тоже, просто ослабел, чтобы сделать в awk. – Sudeep

+0

Как учебное упражнение, это хорошо, однако, grep также работает быстрее, а по биометрии, вероятно, полезная функция. – ocodo

2
/abc/{if(a!="")print a;print;a="";next} 
{a=$0} 
+0

ваш скрипт неправильно обрабатывает случай, например «bcd \ nabc \ nabcdef». –

+0

Исправлено для этого. –

1

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

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

0

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

awk -v count=1 '/abc/{{i++};if(i==count){print a;print;exit}};{a=$0}' file 
1

Я создал следующий скрипт 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 
Смежные вопросы