Seu problema é que você disse:
print $header
.. em vez de:
print header
Você deseja um conteúdo variável não interpolado.
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
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
Tags awk