Образец печати символа "С"

Образец печати символа "С"

Я хотел бы вывести образец остатка цистеина из каждой строки, указанной в file.tsv. В file.tsv есть два столбца: sequenceID и Sequence. Во втором столбце последовательности первый символ «C» должен быть выведен как C, если следующий непосредственный остаток не C, то код должен вывести C#. # должен встречаться только один раз для n-го количества различных аминокислот.

Поэтому, когда в столбце «C» следует другой символ, я хотел бы напечатать # после «C». Таким образом, если столбец последовательности имеет значение DCFRCGHCC, то в третьем столбце должно быть напечатано C#C#CC.

Пример ввода:

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

Вывод должен состоять из трех столбцов: 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 

решение1

Первый однострочный / полный скрипт анализирует и преобразует формат файла, описанный в вопросе; второй полный скрипт анализирует и преобразует формат файла FASTA.


#1

Однострочник в стиле гольфа:

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

Развернутый полный сценарий:

#!/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

Объяснение:

  • Входной файл обрабатывается построчно;
  • Каждая строка разделена на две строки: часть до пробела и часть после пробела;
  • Каждая подстрока, состоящая из символа «C», за которым может следовать другой символ (также можно обнаружить символ «C» в конце строки) во второй строке, оценивается, и если символ, следующий за «C», является «C», то «C» добавляется в конец пользовательской временной строки; в противном случае в конец пользовательской временной строки добавляется «C#»;
  • Первая, вторая и пользовательская временная строки выводятся через запятую, за которыми следует новая строка;

Пример вывода:

% 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

Расширенная полная версия:

#!/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

Объяснение:

  • Входной файл обрабатывается построчно;
  • Если текущая строка начинается с >символа, к строке добавляется пробел; если следующая строка существует и не начинается с символа >, символ новой строки удаляется из текущей строки; текущая строка выводится во временный файл;
  • Временный файл обрабатывается построчно;
  • Каждая строка разделена на две строки: часть до последнего пробела и часть после последнего пробела;
  • Каждая подстрока, состоящая из символа «C», за которым может следовать другой символ (также можно обнаружить символ «C» в конце строки) во второй строке, оценивается, и если символ, следующий за «C», является «C», то «C» добавляется в конец пользовательской временной строки; в противном случае в конец пользовательской временной строки добавляется «C#»;
  • Первая, вторая и пользовательская временная строки выводятся через запятую, за которыми следует новая строка;
  • Временный файл удален;

Пример вывода:

% 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#

решение2

Вот awkверсия, которая может вам подойти

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

Он просто дублирует второе поле, затем удаляет любую непустую начальную последовательность не-C-символов в дубликате, затем заменяет каждую оставшуюся последовательность не-C-символов в нем на #.

Связанный контент