Isso deve fazer o que você precisa:
for i in $(awk '{print $1"_"$2+1"_"$3}' foo.bed); do grep -A 1 $i seqs.fa ; done
Explicação
-
awk '{print $1"_"$2+1"_"$3}' foo.bed
: isso imprimirá o cromossomo e as coordenadas de início e fim de cada linha do arquivo .bed. Observe o$2+1
, pois as coordenadas no seu arquivo são diferentes das do.bed
. Por exemplo, para as três primeiras linhas do seu arquivo:$ awk '{print $1"_"$2+1"_"$3}' foo.bed chr10_91061478_91062132 chr12_77456451_77457116 chr7_150754940_150755706
-
for i in $(command); do ...; done
: isso salvará cada valor retornado porcommand
como$i
e, em seguida, fará algo com ele. -
grep -A 1 $i seqs.fa
: esse é o "algo". Ele irá grep para cada resultado do comandoawk
e imprimirá a linha correspondente, bem como a próxima (-A 1
).
Se você precisar fazer isso novamente, não use o RSAT! 1 Há maneiras muito mais simples de fazer isso. Em vez disso, baixe as seqüências FASTA de cada cromossomo e, em seguida, use as ferramentas do pacote exonerate
(instalável em sistemas baseados no Debian com sudo apt-get install exonerate
). O procedimento (supondo que você tenha um arquivo FASTA para cada cromossomo chamado chrN.fa
) seria:
awk '{print $1,$2,($3-$2)}' foo.bed | while read chr start length; do
fastasubseq /path/to/$chr.fa $start $length >> subseqs.fa
done
O comando acima irá extrair as subseqüências de interesse (assumindo que as coordenadas estão sempre com relação à faixa mais como deveriam) e deve levar apenas alguns segundos.
1 Não me entenda mal, a suíte RSAT é uma ótima ferramenta e eu tenho muito respeito por seu autor com quem trabalhei por alguns anos, é apenas não necessariamente a melhor ferramenta para trabalhos de grande escala.