sed
решение:
$ sed -nE '/>/ s/^.*OS=(.*) OX=.*$/\1/p' .fasta
Ctenodactylus gundi
Nostoc commune
Gallus gallus
-n
, чтобы пространство шаблона не печаталось без запроса; -E
(расширенные регулярные выражения), чтобы мы могли использовать подвыражения и обратные ссылки. Флаг p
команды s
означает «печать пространства шаблона».
Регулярное выражение должно соответствовать всей строке, выделяя в подвыражении фрагмент, который мы должны извлечь. Я предположил, что OX предшествует ровно один пробел, который не должен появляться в выходных данных; это можно скорректировать, если / при необходимости.
Предполагается, что все строки, начинающиеся с >
, будут иметь OS= ...
фрагмент , сразу , за которым следует OX= ...
фрагмент; если нет, то его можно добавить в фильтр />/
перед командой s
. (Между прочим - может ли быть некоторый OT= ...
фрагмент между OS=...
и OX= ...
?)
Вопрос, хотя - вы бы не включили какой-то идентификатор (возможно, часть «метка» в начале каждой строки) для каждой строки вывода? У вас есть запрошенные фрагменты, но знаете ли вы, где находится каждый из них?