Estou tentando extrair a identificação de sequência e o número do cluster que ocorrem em linhas diferentes no mesmo arquivo de texto.
A entrada parece
>Cluster 72
0 319aa, >O311_01007... *
>Cluster 73
0 318aa, >1494_00753... *
1 318aa, >1621_00002... at 99.69%
2 318aa, >1622_00575... at 99.37%
3 318aa, >1633_00422... at 99.37%
4 318aa, >O136_00307... at 99.69%
>Cluster 74
0 318aa, >O139_01028... *
1 318aa, >O142_00961... at 99.69%
>Cluster 75
0 318aa, >O300_00856... *
A saída desejada é o ID da sequência em uma coluna e o número do cluster correspondente na segunda.
>O311_01007 72
>1494_00753 73
>1621_00002 73
>1622_00575 73
>1633_00422 73
>O136_00307 73
>O139_01028 74
>O142_00961 74
>O300_00856 75
Alguém pode ajudar com isso?
>
? Além disso, você pode estar interessado em nosso site irmão, Bioinformática .Respostas:
Com awk:
-F '[. ]*'
>Cluster
linhas), salve o segundo campo como o ID e vá para a próxima linhafonte
$1 == ">Cluster"
vez deNF == 2
, dependendo do que mais possa estar no arquivo.Você pode usar
awk
para isso:A primeira instrução de bloco está capturando o ID do cluster. A segunda instrução de bloco (a padrão) é extrair os dados desejados e imprimi-los.
fonte
" "
como argumentoprint
. Basta usar uma vírgula para separar os argumentos e ele usará o OFS, espaço padrão, para separar os argumentos.Aqui está uma alternativa ao Ruby como uma linha:
ou espalhe em várias linhas:
Eu acho que é apenas mais legível que a
awk
versão se você conhece Ruby e regexen. Como um bônus, esse código pode ser um pouco mais robusto do que simplesmente dividir as linhas, porque procura o texto ao redor.fonte
Perl:
Explicação
perl -ne
: leia o arquivo de entrada linha por linha (-n
) e aplique o script fornecido por-e
cada linha.if(/^>.*?(\d+)/){$n=$1;}
: se essa linha começar com a>
, encontre o maior número de números no final da linha e salve-o como$n
.else{ s/.*(>[^.]+).*/$1 $n/; print
: se a linha não começar>
, substitua tudo pelo trecho mais longo de não-.
caracteres seguindo a>
(>[^.]+
), ou seja, o nome da sequência ($1
porque capturamos a correspondência de regex) e o valor atual de$n
.Ou, para uma abordagem mais estranha:
Essa é apenas uma maneira um pouco mais complicada de fazer a mesma idéia básica das várias
awk
abordagens. Estou incluindo isso por uma questão de conclusão e pelos fãs do Perl. Se você precisar de uma explicação, use as soluções awk :).fonte