awk — если условие выполнено, вывести определенные строки до и после

Имея следующие blastout.txt:

blastout.txt

Мне нужно найти все строки, содержащие Identities = [>=50] и

  1. напечатайте одну строку выше, содержащую Query=
  2. напечатать 5-ю строку ниже

пример вывода (здесь показаны только первые строки):

Query= HWI-ST863:386:C5Y8UACXX:3:1307:8061:42115 1:N:0:ACACGAAT
Sbjct  2030309  ATGACGCTCACCTTGGTGTCGATATCCTCACCTGCGGTGCCAATGCCGCTGCCCGCGGTC  2030250
Query= HWI-ST863:386:C5Y8UACXX:3:2209:19756:21341 1:N:0:ACACGAAT
Sbjct  2418742  CAGGCGTTCCGGCAGTTTGTGCTGGAAGAGGCCCGTGGCCTGGCGGAGCCTCTGCCGGCG  2418683
Query= HWI-ST863:386:C5Y8UACXX:3:1302:8580:7972 1:N:0:ACACGAAT
Sbjct  3178017  CCAGTTATGCTTGGGGCAGGTGAGCTTGTTGCCTTCCAGGGCGAGCTCGGGGATATCCGT  3178076

Я решил 2.:

awk 'c&&!--c;/Identities =/ && ($3+0)>=50 {c=5}' blastout.txt

это было возможно для меня, потому что структура файла всегда одинакова. Но для 1. количество строк меняется, и также может случиться так, что для одной записи Query= есть более одной строки, которые соответствуют шаблону.

Ваша помощь в реализации этого очень ценится!


person rororo    schedule 03.06.2017    source источник


Ответы (2)


/Query/{q=$0} c...; /Identities/...{print q; c=5}

Если это не все, что вам нужно, отредактируйте свой вопрос, чтобы он содержал краткий, проверяемый образец входных данных и ожидаемый результат. Не просите и не ожидайте, что мы отправимся искать примеры на других сайтах, поскольку это означает, что вы слишком ленивы, чтобы придумать краткий пример своей проблемы, и хотите, чтобы мы сделали за вас работу по попытке понять некоторые большие проблемы. набор данных.

Изложены:

awk '/Query/{q=$0} c&&!--c; /Identities =/ && ($3+0)>=50 {print q; c=5}' blastout.txt
person Ed Morton    schedule 03.06.2017
comment
Спасибо за ваш ответ. Это не полный набор данных, полный ~6 Гб. Поэтому я загрузил только часть. Очевидно, я не смог уложить это в несколько строк, так как набор данных казался мне слишком сложным для этого. Теперь я попытаюсь понять решение, которое вы предложили. еще раз спасибо! - person rororo; 03.06.2017
comment
Я придумал awk '/Query= /{q=$0}' blastout.txt | awk 'c&&!--c;/Identities =/ && ($3+0)>=50 {print q, c=5}' blastout.txt сейчас, но все, что я получаю для первой команды awk, это 5. Что означает c...? - person rororo; 03.06.2017
comment
Нет, поместите все это в одну команду. c... обозначает часть вашего кода, начинающуюся с c. Я обновил свой ответ, см. внизу. - person Ed Morton; 03.06.2017
comment
Большое спасибо, awk на самом деле гораздо более интуитивно понятен, чем я думал. просто чтобы быть полным, это должно быть awk '/Query= /... вместо awk '/Query/... - person rororo; 03.06.2017

Ну, я не могу сказать вам, как это сделать с awk, но я могу сделать это с sed.

Сценарий blastout.sed:

# place 'Query=' line in hold space
/^Query=/h
# If we find an Identity line
/^ Identities = \([5-9][0-9]\|[1-9][0-9][0-9]\)/{
# Exchange pattern with hold space (the Query= line) and print
x
p
# Exchange pattern with hold space (the Identities = line) and print
x
p
# Get the fifth line and print
n
n
n
n
n
p
}

Запустите его командой sed -n -f blastout.sed blastout.txt.

Вот некоторые результаты:

$ sed -n -f blastout.sed blastout.txt | head -12
Query= HWI-ST863:386:C5Y8UACXX:3:1307:8061:42115 1:N:0:ACACGAAT
 Identities = 100/100 (100%), Gaps = 0/100 (0%)
Sbjct  2030309  ATGACGCTCACCTTGGTGTCGATATCCTCACCTGCGGTGCCAATGCCGCTGCCCGCGGTC  2030250
Query= HWI-ST863:386:C5Y8UACXX:3:2209:19756:21341 1:N:0:ACACGAAT
 Identities = 99/100 (99%), Gaps = 0/100 (0%)
Sbjct  2418742  CAGGCGTTCCGGCAGTTTGTGCTGGAAGAGGCCCGTGGCCTGGCGGAGCCTCTGCCGGCG  2418683
Query= HWI-ST863:386:C5Y8UACXX:3:1302:8580:7972 1:N:0:ACACGAAT
 Identities = 100/100 (100%), Gaps = 0/100 (0%)
Sbjct  3178017  CCAGTTATGCTTGGGGCAGGTGAGCTTGTTGCCTTCCAGGGCGAGCTCGGGGATATCCGT  3178076
Query= HWI-ST863:386:C5Y8UACXX:3:1106:4759:9532 1:N:0:ACACGAAT
 Identities = 100/100 (100%), Gaps = 0/100 (0%)
Sbjct  32627  CGAGGCCGCGGTTTTGGACCTGGACGAGGGGAGTCGGCGTGTGAGTCTTGCGACCCTGGA  32686

(Исправлено, чтобы печатать пятую строку вниз.)

person Jack    schedule 03.06.2017
comment
спасибо, тоже приятно! сбоку: строка, начинающаяся с Identities, не нужна. - person rororo; 03.06.2017