Remover pedaço de linhas de acordo com números de série

2

Estou processando arquivos fastq a partir de dados de sequenciamento de próxima geração organizados da seguinte forma:

  • Linha 1 informações sobre a máquina seqüenciadora, a pista, as "peças" e o número da leitura
  • Row 2 informações sobre a sequência
  • A linha 3 é um símbolo + usado como separador
  • Row 4 informações sobre a qualidade das leituras

Eu gostaria de remover todas as leituras que estão no intervalo de números específicos na quinta posição da primeira linha (em preto).

Aqui um exemplo de leituras para remover entre 1101 a 1103. Entrada:

@ST-E00204:114:HHKTJALXX:4:1101:22962:1538_1:N:0:1/1
NGTGTTTTTAATTATTAAGTTATTTTTTTAGTTTTTTAAGGATTTTTATAGTAGTAATAGAAATTTAATTAAGATAGAAAATTTTAAGTGTGGTTAGGATTGTAGTTTTGTTGGTATTATGTTGATTTAGTATAAGTAAAGTTTTGATTTT
+
AAAAJJJJFJJAJJJJAJAJJJJJJJJJAJJ-FJJJJF--FJJJJFJJJFFJJJFFJ-JJJJFFFFJ-AJ7AJJJJJJJJJJFJJJJFJFAJFFJJF-AAFAJFJJ7AJAJJFJFJJJ7FFFFFJFJJ-7F-77AJF--7FJJ


@ST-E00204:114:HHKTJALXX:4:1102:7101:2012 2:N:0:1
NATTTAAAAATACCCACTATAAAACATAAAATATAACAAAAAAACTAAAAATCATAAAAAATAAAAAAAATCCACTTCACGTCTTTTAACAATTTCGTCATTTTTAACATCCTCAAATAAATTATTCTCATTTTCCATAACTTCCAATTTT
+
!A-A-FJJJJJJ-FJAJFJJJJJFJJAJJJJJJ-F-AJJJJJJ-F-FJJFJJFJFFFFF<-F<FJJJF-<7<JF<-7AAFFJ--A<A77--7FAAF-A----7FF-7-7<F-J<A-7--<F7---77<----7-<<FA---7<<---7---

@ST-E00204:114:HHKTJALXX:4:1103:7141:2012 2:N:0:1
NAAAACATAAAATATAACAAACAAACTAAAAATCATAAAAAATAAAAAACATCCACTTAACAACTTAAAAAATAACAAAATCACTAATTATAATAAAAAATAAAAAATACACACTCTAACACCTAAAACACAACCAAAAAACTAAAACTCC
+
!AAFFFFJJJJA-F--AFFJJ-F<JJF<AJFJ<JF-7<JJAA7-J-FFFJ7JJJFJ-F<AJJJJFFJ-A-F-AJ<FF-JFFF-77<JJ---777<7----7-A<J-A-7<<FFF<--7--7-FFFF-<---7---7A-<A7FA------7-

@ST-E00204:114:HHKTJALXX:4:1104:7101:2012 2:N:0:1
NATTTAAAAATACCCACTATAAAACATAAAATATAACAAAAAAACTAAAAATCATAAAAAATAAAAAAAATCCACTTCACGTCTTTTAACAATTTCGTCATTTTTAACATCCTCAAATAAATTATTCTCATTTTCCATAACTTCCAATTTT
+
!A-A-FJJJJJJ-FJAJFJJJJJFJJAJJJJJJ-F-AJJJJJJ-F-FJJFJJFJFFFFF<-F<FJJJF-<7<JF<-7AAFFJ--A<A77--7FAAF-A----7FF-7-7<F-J<A-7--<F7---77<----7-<<FA---7<<---7---

Saída desejada:

@ST-E00204:114:HHKTJALXX:4:1104:7101:2012 2:N:0:1
NATTTAAAAATACCCACTATAAAACATAAAATATAACAAAAAAACTAAAAATCATAAAAAATAAAAAAAATCCACTTCACGTCTTTTAACAATTTCGTCATTTTTAACATCCTCAAATAAATTATTCTCATTTTCCATAACTTCCAATTTT
+
!A-A-FJJJJJJ-FJAJFJJJJJFJJAJJJJJJ-F-AJJJJJJ-F-FJJFJJFJFFFFF<-F<FJJJF-<7<JF<-7AAFFJ--A<A77--7FAAF-A----7FF-7-7<F-J<A-7--<F7---77<----7-<<FA---7<<---7---

Uma ideia era usar:

split -l 4 myfile.fq

e, em seguida, remova cada arquivo de acordo com os números na quinta posição, como:

grep -v ":1104"
grep -v ":1105"

mas o problema é que o arquivo é muito grande. Também tenho que remover grandes intervalos como de 1000 a 2000 e cada número corresponde a muitas leituras.

    
por fusion.slope 16.06.2017 / 11:32

3 respostas

2
Solução

awk :

awk -F':' -v RS="@" 'NR>1 && ($5<1101 || $5>1103){ print RS$0 }' myfile.fq

A saída:

@ST-E00204:114:HHKTJALXX:4:1104:7101:2012 2:N:0:1
NATTTAAAAATACCCACTATAAAACATAAAATATAACAAAAAAACTAAAAATCATAAAAAATAAAAAAAATCCACTTCACGTCTTTTAACAATTTCGTCATTTTTAACATCCTCAAATAAATTATTCTCATTTTCCATAACTTCCAATTTT
+
!A-A-FJJJJJJ-FJAJFJJJJJFJJAJJJJJJ-F-AJJJJJJ-F-FJJFJJFJFFFFF<-F

Detalhes :

  • -F':' - separador de campos :

  • -v RS="@" - considerando @ como separador de registro

  • ($5<1101 || $5>1103) - verifique se o campo necessário se encaixa na condição " remova entre 1101 a 1103 "

por 16.06.2017 / 11:46
1

Aqui está uma solução awk que assume que cada bloco tem exatamente 4 linhas de comprimento.

awk -F ':' '
    NR % 4 == 1 { keep = ($5 < 1101 || $5 > 1103) }
    keep
'

Explicações:

  • -F : define o separador de campo como : . $5 é o quinto campo na linha atual (numerado de 1).
  • NR % 4 == 1 { … } executa o código nas chaves se a condição NR % 4 == 1 for verdadeira, ou seja, se o número da linha atual for um múltiplo de 4 mais 1.
  • keep = (…) define a variável keep para a condição especificada.
  • A linha com apenas keep diz para imprimir a linha atual se a variável keep for verdadeira. Como keep é definido somente a cada 4 linhas, ele se aplica de forma idêntica a todas as linhas dentro de um bloco de 4 linhas.
por 17.06.2017 / 01:47
0
sed -e '
   /@/s/:/\n/4; /@/s/:/\n/4
   /\n110[1-3]\n/,/^$/d
   y/\n/:/
' fastq.data
  1. Marque o número de série nas linhas que começam com @ .
  2. Exclua o trecho que contém o número de série 1101 ou 1102 ou 1103.
  3. Em todos os outros pedaços, retire os marcadores e deixe-os ir para stdout.

Resultado

@ST-E00204:114:HHKTJALXX:4:1104:7101:2012 2:N:0:1
NATTTAAAAATACCCACTATAAAACATAAAATATAACAAAAAAACTAAAAATCATAAAAAATAAAAAAAATCCACTTCACGTCTTTTAACAATTTCGTCATTTTTAACATCCTCAAATAAATTATTCTCATTTTCCATAACTTCCAATTTT
+
!A-A-FJJJJJJ-FJAJFJJJJJFJJAJJJJJJ-F-AJJJJJJ-F-FJJFJJFJFFFFF<-F
    
por 16.06.2017 / 17:16