Grep / awk / sed para linhas compostas de apenas duas letras e linhas que começam com uma letra e atendem a um determinado comprimento

3

Não tenho certeza de quantas pessoas estão familiarizadas com os dados de sequenciamento de DNA, mas se isso fizer parte do meu arquivo (as linhas que começam com ">" são IDs e as linhas que começam com uma letra são sequências de DNA):

>NB501013:9:HJJ75BGXX:4:13609:24076:18015/2
GGGGGGGAAAAAAA
>NB501013:9:HJJ75BGXX:4:21602:19346:16945/2
CTCGTCGCATCACAAAGGGAT
>NB501013:9:HJJ75BGXX:3:11407:17650:13229/2
CCGCGGGCCGGTGCGGGGGTTTTTTTGTTTTTTTGGTTACAACGGGTGGG
>NB501013:9:HJJ75BGXX:3:13509:1817:13239/2
CAGCCC
>NB501013:9:HJJ75BGXX:4:22611:20567:13384/2
GAATA

Eu gostaria de remover a linha: GGGGGGGAAAAAAA

Junto com sua ID de sequenciamento (sei que você pode fazer isso usando grep -B1 ). Mas alguém sabe como remover as linhas que são compostas apenas de duas letras?

Além disso, para sequências com menos de cinco letras, eu gostaria de removê-las juntamente com seus IDs, não posso simplesmente procurar linhas mais longas que um determinado comprimento, porque todas as IDs são muito longas, então preciso de alguma forma, use grep -v nas linhas que começam com uma letra (portanto, não inicia com ">") e é mais longo que um determinado tamanho.

Portanto, a saída da minha amostra seria:

>NB501013:9:HJJ75BGXX:4:21602:19346:16945/2
CTCGTCGCATCACAAAGGGAT
>NB501013:9:HJJ75BGXX:3:11407:17650:13229/2
CCGCGGGCCGGTGCGGGGGTTTTTTTGTTTTTTTGGTTACAACGGGTGGG
>NB501013:9:HJJ75BGXX:3:13509:1817:13239/2
CAGCCC
    
por ehze 02.06.2016 / 18:48

3 respostas

3

Conceder grep com P erl C ompatible RE gexp module uma tentativa:

  • para remover combinações de duas letras:

    pcregrep -Mv '>.*\n([ACGT])*([ACGT])*(|)*$' file
    

    saída:

    >NB501013:9:HJJ75BGXX:4:21602:19346:16945/2
    CTCGTCGCATCACAAAGGGAT
    >NB501013:9:HJJ75BGXX:3:11407:17650:13229/2
    CCGCGGGCCGGTGCGGGGGTTTTTTTGTTTTTTTGGTTACAACGGGTGGG
    >NB501013:9:HJJ75BGXX:3:13509:1817:13239/2
    CAGCCC
    >NB501013:9:HJJ75BGXX:4:22611:20567:13384/2
    GAATA
    
  • para remover a combinação de 5 letras ou menos:

     pcregrep -Mv '>.*\n[ACGT]{1,5}$' file
    

    saída:

    >NB501013:9:HJJ75BGXX:4:13609:24076:18015/2
    GGGGGGGAAAAAAA
    >NB501013:9:HJJ75BGXX:4:21602:19346:16945/2
    CTCGTCGCATCACAAAGGGAT
    >NB501013:9:HJJ75BGXX:3:11407:17650:13229/2
    CCGCGGGCCGGTGCGGGGGTTTTTTTGTTTTTTTGGTTACAACGGGTGGG
    >NB501013:9:HJJ75BGXX:3:13509:1817:13239/2
    CAGCCC
    
por 02.06.2016 / 19:37
1
#!/usr/bin/env perl
#
# Usage: thisscriptname < someinputfile

use strict;
use warnings;

while (1) {
  exit if eof;
  # rash assumption there are always pairs of ID and sequence lines
  # NOTE these contain a newline, so many need chomp() depending
  # on what you do with them...
  my $id = readline;
  my $seq = readline;

  # calculate unique sequence letters via hash (is there also a U
  # or something? been a few decades since AP bio...)
  my %chars;
  $chars{$_}++ for $seq =~ m/[ATGC]/g;

  # business logic time!
  if (keys %chars > 2 and length $seq >= 5) {
    print $id;
    print $seq;
  }
}
    
por 02.06.2016 / 19:39
1

Você pode considerar reverter o arquivo, testando a sequência de DNA e, se o teste for aprovado, ignore esta linha e a próxima linha :

tac file |
  awk '!/^>/ && (length($1) < 5 || $1 == "GGGGGGGAAAAAAA") {getline; next} 1' |
  tac
    
por 02.06.2016 / 19:45