Padrão de impressão do caractere “C”

1

Eu gostaria de imprimir o padrão do resíduo Cys de cada linha dada em file.tsv. file.tsv tem duas colunas como sequenceID e Sequence. a partir da segunda coluna, o primeiro caractere "C" deve ser impresso como C, se o próximo resíduo imediato não for C, então o código deve imprimir C #. # deve ocorrer apenas uma vez para o número n de várias ocorrências de aminoácidos.

Então, quando na coluna se "C" é seguido por outro caractere eu gostaria de imprimir # após "C". Portanto, se a coluna de sequência tiver valor DCFRCGHCC, ela deverá imprimir na terceira coluna C # C # CC.

Exemplo de entrada:

c32_g1_i1_ 3GQKAKLKVPVFFLHRRGSICSSFYLMFSFEIKKK*TSKN*CFVCVRVRNRERAGVKCAHVYCPMFNGTQTH*IIISSLNS
c32_g1_i1_ 6AV*TADDDLVRLCSIEHGTIHMCTLYTCCTLTVTHTYTHKTLIFACLFFFNFKGEHQIERAANRTSSM*KKHRNF*LGLLAX

A saída deve ter três colunas: sequenceID, Sequence, Cys pattern

c32_g1_i1_3,GQKAKLKVPVFFLHRRGSICSSFYLMFSFEIKKK*TSKN*CFVCVRVRNRERAGVKCAHVYCPMFNGTQTH*IIISSLNS,C#C#C#C#C
c32_g1_i1_6,AV*TADDDLVRLCSIEHGTIHMCTLYTCCTLTVTHTYTHKTLIFACLFFFNFKGEHQIERAANRTSSM*KKHRNF*LGLLAX,C#C#CC#C 
    
por Trupti 07.10.2015 / 09:56

2 respostas

5

O primeiro script one-liner / full parse e converte o formato de arquivo descrito na questão; o segundo script completo analisa e converte um formato de arquivo FASTA.

# 1

Uma linha de golfe:

perl -lane 'my $s;my @m=$F[1]=~/C.?/g;foreach(@m){$_ eq"CC"?$s.="C":$s.="C#"}push(@F,$s);print(join(",",@F))' infile

Roteiro completo expandido:

#!/usr/bin/perl

use strict;
use warnings;

@ARGV == 1 || die("Usage: <command> <input_file>\n");

open(my $in, $ARGV[0]) || die("Could not open input file \"$ARGV[0]\": $!\n");

while(<$in>) {
    my $string;
    my @fields = split(" ");
    my @matches = $fields[1] =~ /C.?/g;
    foreach(@matches) {
        $_ eq "CC" ? $string .= "C" : $string .= "C#"
    }
    push(@fields, $string);
    print(join(",", @fields) . "\n")
}

close($in);

exit

Explicação:

  • O arquivo de entrada é processado linha por linha;
  • Cada linha é dividida em duas strings, a parte antes do espaço e a parte depois do espaço;
  • Cada substring feita de um caractere "C" opcionalmente seguido por outro caractere (opcionalmente para capturar também um caractere "C" no final da string) na segunda string é avaliada, e se o caractere seguir o "C" é um "C", "C" é anexado ao final de uma string temporária personalizada; caso contrário, "C #" será anexado no final da string temporária personalizada;
  • A primeira, segunda e sequência temporária personalizada são impressas, separadas por vírgulas, seguidas por uma nova linha;

Exemplo de saída:

% cat infile
c32_g1_i1_3 GQKAKLKVPVFFLHRRGSICSSFYLMFSFEIKKK*TSKN*CFVCVRVRNRERAGVKCAHVYCPMFNGTQTH*IIISSLNS
c32_g1_i1_6 AV*TADDDLVRLCSIEHGTIHMCTLYTCCTLTVTHTYTHKTLIFACLFFFNFKGEHQIERAANRTSSM*KKHRNF*LGLLAX
% perl -ne 'my $s;my @f=split(" ");my @m=$f[1]=~/C.?/g;foreach(@m){$_ eq"CC"?$s.="C":$s.="C#"}push(@f,$s);print(join(",",@f)."\n")' infile
c32_g1_i1_3,GQKAKLKVPVFFLHRRGSICSSFYLMFSFEIKKK*TSKN*CFVCVRVRNRERAGVKCAHVYCPMFNGTQTH*IIISSLNS,C#C#C#C#C#
c32_g1_i1_6,AV*TADDDLVRLCSIEHGTIHMCTLYTCCTLTVTHTYTHKTLIFACLFFFNFKGEHQIERAANRTSSM*KKHRNF*LGLLAX,C#C#CC#C#

# 2

Versão completa expandida:

#!/usr/bin/perl

use strict;
use warnings;

@ARGV == 1 || die("Usage: <command> <input_file>\n");

open(my $in, $ARGV[0]) || die("Could not open input file \"$ARGV[0]\": $!\n");
open(my $tmp, "+>", "tmpfile") || die("Could not create temporary file \"tmpfile\": $!\n");

select($tmp);

while(<$in>) {
    if(/^>/) {
        s/$/ /
    }
    if(my $next = <$in>) {
        if($next !~ /^>/) {
            chomp
        }
        print;
        seek($in, -length($next), 1)
    }
    else {
        print
    }
}

close($in);

seek($tmp, 0, 0);

select(STDOUT);

while(<$tmp>) {
    my $string;
    my @fields = split(/ (?!.* )|\n/);
    my @matches = $fields[1] =~ /C.?/g;
    foreach(@matches) {
        $_ eq "CC" ? $string .= "C" : $string .= "C#"
    }
    push(@fields, $string);
    print(join(",", @fields) . "\n")
}

close($tmp);

unlink("tmpfile");

exit

Explicação:

  • O arquivo de entrada é processado linha por linha;
  • Se a linha atual começar com um caractere > , um espaço será anexado à linha; se uma linha a seguir existir e não começar com um caractere > , o caractere de nova linha será removido da linha atual; a linha atual é impressa em um arquivo temporário;
  • O arquivo temporário é processado linha por linha;
  • Cada linha é dividida em duas strings, a parte antes do último espaço e a parte depois do último espaço;
  • Cada substring feita de um caractere "C" opcionalmente seguido por outro caractere (opcionalmente para capturar também um caractere "C" no final da string) na segunda string é avaliada, e se o caractere seguir o "C" é um "C", "C" é anexado ao final de uma string temporária personalizada; caso contrário, "C #" será anexado no final da string temporária personalizada;
  • A primeira, segunda e sequência temporária personalizada são impressas, separadas por vírgulas, seguidas por uma nova linha;
  • O arquivo temporário é removido;

Exemplo de saída:

% cat infile 
>c32_g1_i1_
3GQKAKLKVPVFFLHRRGSICSSFYLMFSFEIKKK*TSKN*CFVCVRVRNRERAGVKCAHVYCPMFNGTQTH*IIISSLNS
3GQKAKLKVPVFFLHRRGSICSSFYLMFSFEIKKK*TSKN*CFVCVRVRNRERAGVKCAHVYCPMFNGTQTH*IIISSLNS
>c32_g1_i1_
6AV*TADDDLVRLCSIEHGTIHMCTLYTCCTLTVTHTYTHKTLIFACLFFFNFKGEHQIERAANRTSSM*KKHRNF*LGLLAX
6AV*TADDDLVRLCSIEHGTIHMCTLYTCCTLTVTHTYTHKTLIFACLFFFNFKGEHQIERAANRTSSM*KKHRNF*LGLLAX
% perl script.pl infile 
>c32_g1_i1_,3GQKAKLKVPVFFLHRRGSICSSFYLMFSFEIKKK*TSKN*CFVCVRVRNRERAGVKCAHVYCPMFNGTQTH*IIISSLNS3GQKAKLKVPVFFLHRRGSICSSFYLMFSFEIKKK*TSKN*CFVCVRVRNRERAGVKCAHVYCPMFNGTQTH*IIISSLNS,C#C#C#C#C#C#C#C#C#C#
>c32_g1_i1_,6AV*TADDDLVRLCSIEHGTIHMCTLYTCCTLTVTHTYTHKTLIFACLFFFNFKGEHQIERAANRTSSM*KKHRNF*LGLLAX6AV*TADDDLVRLCSIEHGTIHMCTLYTCCTLTVTHTYTHKTLIFACLFFFNFKGEHQIERAANRTSSM*KKHRNF*LGLLAX,C#C#CC#C#C#C#CC#C#
    
por kos 07.10.2015 / 10:58
0

Aqui está uma versão awk que pode funcionar para você

awk '{OFS=","; =; sub(/[^C]+/,"",); gsub(/[^C]+/,"#",); print}' file

Ele apenas duplica o segundo campo, depois retira qualquer seqüência inicial não vazia de caracteres não-C na duplicata e, em seguida, substitui cada seqüência restante de caracteres não C nela por # .

    
por steeldriver 07.10.2015 / 14:31