「C」文字の印刷パターン

「C」文字の印刷パターン

file.tsv で指定された各行から Cys 残基のパターンを出力したいと思います。file.tsv には、sequenceID と Sequence の 2 つの列があります。2 番目の列のシーケンスの最初の文字 "C" は C として出力され、次の残基が C でない場合は、コードは C# を出力する必要があります。# は、さまざまなアミノ酸の出現回数 n 回に対して 1 回だけ出現する必要があります。

したがって、列で「C」の後に別の文字が続く場合は、「C」の後に # を印刷します。したがって、シーケンス列の値が DCFRCGHCC の場合、3 番目の列に C#C#CC が印刷される必要があります。

入力例:

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

出力は3つの列になります: シーケンスID、シーケンス、Cysパターン

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

最初のワンライナー/フル スクリプトは、質問で説明されているファイル形式を解析して変換します。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

説明:

  • 入力ファイルは行ごとに処理されます。
  • 各行は、スペースの前の部分とスペースの後の部分の 2 つの文字列に分割されます。
  • 2 番目の文字列内の、オプションで別の文字が続く「C」文字 (文字列の末尾の「C」文字もオプションでキャッチ) で構成される各サブ文字列が評価され、「C」の後の文字が「C」の場合、「C」がカスタム一時文字列の末尾に追加されます。それ以外の場合は、「C#」がカスタム一時文字列の末尾に追加されます。
  • 最初の文字列、2 番目の文字列、カスタム一時文字列がコンマで区切られ、その後に改行が続いて出力されます。

サンプル出力:

% 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

説明:

  • 入力ファイルは行ごとに処理されます。
  • 現在の行が>文字で始まる場合、その行にスペースが追加されます。次の行が存在し、文字で始まっていない場合は>、現在の行から改行文字が削除されます。現在の行は一時ファイルに出力されます。
  • 一時ファイルは行ごとに処理されます。
  • 各行は、最後のスペースの前の部分と最後のスペースの後の部分の 2 つの文字列に分割されます。
  • 2 番目の文字列内の、オプションで別の文字が続く「C」文字 (文字列の末尾の「C」文字もオプションでキャッチ) で構成される各サブ文字列が評価され、「C」の後の文字が「C」の場合、「C」がカスタム一時文字列の末尾に追加されます。それ以外の場合は、「C#」がカスタム一時文字列の末尾に追加されます。
  • 最初の文字列、2 番目の文字列、カスタム一時文字列がコンマで区切られ、その後に改行が続いて出力されます。
  • 一時ファイルは削除されます。

サンプル出力:

% 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

2 番目のフィールドを複製し、複製内の空でない最初の非 C 文字シーケンスを削除し、残りの非 C 文字シーケンスを に置き換えます#

関連情報