Вот решение sed
со следующими допущениями: вы ищете последовательные строки, в которых фиксированные слова gene
и rRNA
(как полные слова, а не фрагменты слов) появляются в конце первого, соответственно вторую строку, и в этих случаях замените gene
на rRNA
. Числа, предшествующие этим словам, не играют никакой роли. (Если вместо этого они должны совпадать, это тоже можно упорядочить.)
Сначала взгляните на созданный мной входной файл для проверки особых ситуаций:
$cat ff
13960 12602 gene
13963 12602 rRNA
10030 24022 general
10040 32002 rRNA
30902 32098 gene
34003 30934 gene
40902 30921 rRNA
42093 40023 zymogene
34020 rRNA
30202 10030 para
40302 20030 gene
crRNA
Здесь gene
будет заменить на rRNA
ровно на две строки: те, которые начинаются с цифр 13960 и 34003. Обратите внимание, что строка, начинающаяся с 42093 - gene
, появляется в конце, но не как полное слово, и ее не следует заменять , Кроме того, последняя строка заканчивается строкой rRNA
, но поскольку это фрагмент слова, а не полное слово, gene
над ним не следует заменять.
Тогда:
$ sed '{N;s/\bgene\(\n.*\brRNA\)$/rRNA\1/;P;D}' ff
13963 12602 rRNA
13963 12602 rRNA
10030 24022 general
10040 32002 rRNA
30902 32098 gene
34003 30934 rRNA
40902 30921 rRNA
42093 40023 zymogene
34020 rRNA
30202 10030 para
40302 20030 gene
crRNA
Обработка начинается с первой строки. На каждом шаге: N
добавляет новую строку и следующую строку ввода в пространство шаблона; s
заменяет gene
на rRNA
, если первая строка заканчивается полным словом gene
, а вторая заканчивается полным словом rRNA
(обратите внимание на использование утверждения \b
); P
печатает первую строку из пространства шаблона (независимо от того, была ли она оставлена без изменений или подверглась замене gene
<- <code>rRNA); D
затем удаляет эту первую строку (включая новую строку) из пространства шаблона. Затем цикл начинается снова: N
добавляет новую строку и следующую строку ввода в пространство шаблона и т. Д. c. Когда мы достигаем последней строки, N ничего не делает (так как в файле больше нет строк); команда s
автоматически не найдет совпадений, P
напечатает последнюю строку, D
удалит ее, и все готово. Обратите внимание, что в стандарте POSIX в последней строке, если N
не находит "следующей" строки, sed
завершается (и, следовательно, последняя строка не является P
набранной); так что это решение в полной мере использует это расширение GNU команды N
.