Imprima a linha n-1 (e n) se a linha n preencher a condição

2

Eu tenho um arquivo fasta parecido com isto:

>19 dna:chromosome chromosome:NCBIM37:19:1:61342430:1 37330562 ID13406 U -
TACATGGGTGACAAGGAGGTCAGGTGTTA
>19 dna:chromosome chromosome:NCBIM37:19:1:61342430:1 37330584 ID57999 U -
TGTCAAAGGAAGCCTTACTATACATGG

As linhas que começam com ">" são cabeçalhos, os outros dados.

Eu quero remover todas as linhas que não sejam de cabeçalho que sejam menores que 26 ou maiores que 31. Eu também quero remover o cabeçalho pertencente a essas linhas (ou seja, a linha anterior).

Meu código até agora

awk '
{if (substr($0,1,1) == ">") 
    {header=$0} 
else 
    {if ((length($0) > 25) && (length($0) < 32)) {print $header "\n" $0}}}' *

mas isso me dá a mensagem de erro

awk '{if (substr($0,1,1) == ">") {header=$0} else {if ((length($0) > 25) && (length($0) < 32)) {print $header $0}}}' *
), name "header"ld $(>19 dna:chromosome chromosome:NCBIM37:19:1:61342430:1 37330562 ID13406 U -
 input record number 2, file Cluster_1.fas
 source line number 1
    
por The Unfun Cat 14.06.2013 / 13:11

2 respostas

3

Seu problema é que você disse:

print $header

.. em vez de:

print header

Você deseja um conteúdo variável não interpolado.

    
por 14.06.2013 / 13:33
4

Parece que é mais fácil resolvê-lo com sed :

sed '/^>/{N;/\n.\{26,31\}$/!d}'

pequena explicação:

/^>/ corresponde a uma cadeia com cabeçalho
{} aplica grupo de comando a um padrão
N anexa a próxima linha a um padrão
/\n.\{26,31\}$/ verifica se a contagem de símbolos está entre 26. 31% !d se for correspondido apenas passe, senão delete

    
por 14.06.2013 / 13:26

Tags