Распечатка рисунка «С»

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

Поэтому, когда в столбце, если за «С» следует другой символ, я бы хотел напечатать # после «С». поэтому, если столбец последовательности имеет значение 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
задан 8 October 2015 в 14:13

2 ответа

Первая острота / полный синтаксический анализ сценария и преобразовывает формат файла, описанный в вопросе; второй полный сценарий анализирует и преобразовывает формат файла 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

Объяснение:

  • Входной файл обрабатывается линию за линией;
  • Каждая строка является splitted в две строки, часть перед пространством и частью после пространства;
  • Каждая подстрока, сделанная из символа "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

Объяснение:

  • Входной файл обрабатывается линию за линией;
  • Если текущая строка запускается с a > символ, пространство добавляется к строке; если следующая строка существует и не запускается с a > символ, символ новой строки разделяется от текущей строки; текущая строка печатается во временный файл;
  • Временный файл обрабатывается линию за линией;
  • Каждая строка является splitted в две строки, часть перед последним пространством и частью после последнего пространства;
  • Каждая подстрока, сделанная из символа "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#
5
ответ дан 9 October 2015 в 00:13
  • 1
    Я все еще получаю ту же ошибку. это имеет какое-либо отношение к версии Ubuntu? Я работаю 16.04 – Suraj 26 December 2016 в 20:13

Вот awk версия, которая могла бы работать на Вас

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

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

0
ответ дан 9 October 2015 в 00:13
  • 1
    Можете Вы отправлять вывод следующей команды: sudo dpkg-l | grep кот. – Rajesh Keladimath 26 December 2016 в 20:25

Другие вопросы по тегам:

Похожие вопросы: