“C”字印刷图案

Tru*_*pti 1 command-line text-processing

我想从 file.tsv 中给出的每一行打印 Cys 残基的模式。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
Run Code Online (Sandbox Code Playgroud)

输出应该是三列: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 
Run Code Online (Sandbox Code Playgroud)

kos*_*kos 5

第一个单行/完整脚本解析并转换问题中描述的文件格式;第二个完整脚本解析并转换 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
Run Code Online (Sandbox Code Playgroud)

扩展的完整脚本:

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
Run Code Online (Sandbox Code Playgroud)

解释:

  • 输入文件逐行处理;
  • 每行分为两个字符串,空格前的部分和空格后的部分;
  • 评估第二个字符串中由“C”字符可选后跟另一个字符(可选地也捕获字符串末尾的“C”字符)组成的每个子字符串,并且如果“C”后面的字符是“ C", "C" 附加到自定义临时字符串的末尾;否则在自定义临时字符串的末尾附加“C#”;
  • 打印第一个、第二个和自定义临时字符串,以逗号分隔,后跟换行符;

示例输出:

#!/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
Run Code Online (Sandbox Code Playgroud)

#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#
Run Code Online (Sandbox Code Playgroud)

解释:

  • 输入文件逐行处理;
  • 如果当前行以>字符开头,则在行后附加一个空格;如果下一行存在且不以>字符开头,则从当前行中删除换行符;当前行被打印到一个临时文件中;
  • 临时文件逐行处理;
  • 每行分为两个字符串,最后一个空格之前的部分和最后一个空格之后的部分;
  • 评估第二个字符串中由“C”字符可选后跟另一个字符(可选地也捕获字符串末尾的“C”字符)组成的每个子字符串,并且如果“C”后面的字符是“ C", "C" 附加到自定义临时字符串的末尾;否则在自定义临时字符串的末尾附加“C#”;
  • 打印第一个、第二个和自定义临时字符串,以逗号分隔,后跟换行符;
  • 临时文件被删除;

示例输出:

#!/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
Run Code Online (Sandbox Code Playgroud)