Veja como fazer isso em sed
:
sed -n '/$$</! H; /$$</{x; s/\n/\t/gp}; ${x; s/\n/\t/gp}' stage1 > stage3
Em pedaços:
-
sed -n
significa não imprimir saída padrão (ou seja, a entrada massageada); imprima somente quando houver um comandop
. -
/$$</! H
significa que você vê uma linha não contendo$$<
, anexá-lo ao espaço " h antigo" (ou seja, uma área de preparação). O!
inverte a lógica normal, significa "faça isso para linhas que não satisfazem essa condição". Se você precisar ignorar$$<
que ocorre no meio de uma linha, altere este (e o próximo comando) para usar/^$$</
. (Se você precisar processar$$<
no meio de uma linha de maneira diferente - por exemplo, insira uma nova linha antes dela - edite sua pergunta para dizer isso.)Se você acrescentar uma linha ao espaço de espera quando já houver algo lá (no espaço de espera),
sed
insere uma nova linha entre eles, então isso vai construir texto no espaço de espera que se parece com isso:$$<002L_tbflnewlinePutative transcription factor 001R;newlineGO:0006355…
O espaço de espera, como o "espaço de padrão" (o buffer de linha de trabalho comum) geralmente não terá uma nova linha explícita no final (é implícita). Claro que é possível inserir explicitamente novas linhas nos espaços.
-
/$$</{…}
significa que os comandos dentro das chaves nas linhas que contêm$$<
.-
x
significa e x altera o conteúdo do espaço de espera e do espaço padrão. -
s/\n/\t/gp
significa - bem, é óbvio, não é? - isso significa substituir a nova linha pela guia (no espaço padrão) g lobally e p rint o resultado.
Quando este comando lê a primeira linha da sua entrada (que contém
$$<
), ox
move essa linha ($$<002L_tbfl
) a partir do espaço padrão para o espaço de espera e move o conteúdo anterior do espaço de armazenamento para o espaço de padrão. Mas, desde que o conteúdo inicial do espaço de espera é nada, isso significa que não há nada para o comandos
trabalhar. Posteriormente, quando você vir$$<
(por exemplo, na linha 7), ele traz o texto com as novas linhas incorporadas (conforme ilustrado acima) no espaço padrão e (como descrito) substitui todas as novas linhas por tabulações e imprime o resultado. -
-
${…}
significa fazer os comandos dentro das chaves quando você chegar ao final da entrada. Estes são os mesmos comandos que fazemos quando vemos um$$<
, para lavar a última linha (ou seja, o último grupo de linhas) do espaço de espera.
Aviso: não é garantido que isso funcione no POSIX sed
.
Eu testei no GNU sed
.