Como encontrar caracteres entre duas cordas e anexá-las com algum texto ao fim da linha?

2

Estou lidando com arquivos fasta com linhas como:

\>97977-100;sample=Samp1  
TAATGATGATTTGT  
\>97978-60;sample=Samp2  
AACATTCAACGCGGTCGGTGAGTA  
\>97979-30;sample=Samp3  
AACCGTAGGAGTTGATGTGCGGT  
\>97980-20;sample=Samp4  
ACTGTCTGTATGTGGTG  

Gostaria de encontrar todos os caracteres entre - e ; e adicioná-los ao final da linha, juntamente com o texto ;size="(value)"; , para que eu obtivesse:

\>97977-100;sample=Samp1;size=100;  
TAATGATGATTTGT  
\>97978-60;sample=Samp2;size=60;  
AACATTCAACGCGGTCGGTGAGTA  
\>97979-30;sample=Samp3;size=30;  
AACCGTAGGAGTTGATGTGCGGT  
\>97980-20;sample=Samp4;size=20;  
ACTGTCTGTATGTGGTG  

Eu vi em este Pergunta alguma ajuda sobre como encontrar os caracteres entre 2 strings, e posso obtê-los com algo como:

sed -n 1~2p $file | sed -e 's/.*-\(.*\);.*//'

E eu sei como acrescentar ao final de uma linha com:

sed "1~2s/$/;size=(I want this to be the output of the command above);/" $file

Mas eu não estou conseguindo os dois juntos. Nem sed com um comando, pois ele fornece um erro de argumento muito grande.

    
por Mafalda Galhardo 25.01.2018 / 17:06

1 resposta

3

sed solução:

sed -E 's/(.*-)([0-9]+)(;.*)/;size=;/' file

A saída:

>97977-100;sample=Samp1;size=100;
TAATGATGATTTGT
>97978-60;sample=Samp2;size=60;
AACATTCAACGCGGTCGGTGAGTA
>97979-30;sample=Samp3;size=30;
AACCGTAGGAGTTGATGTGCGGT
>97980-20;sample=Samp4;size=20;

Ou com awk :

awk -F'-' '/^>/{ $0=$0";size=" int($2) ";" }1' file
    
por 25.01.2018 / 17:10