打印“C”字符的模式

我想从file.tsv中给出的每一行打印Cys残留图案。 file.tsv有两个coloumns作为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模式

 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 

第一个单行/完整脚本解析并转换问题中描述的文件格式; 第二个完整脚本解析并转换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:  \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:  \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# 

这是一个可能适合您的awk版本

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

它只是重复第二个字段,然后在副本中删除任何非空的C字符的非空字符序列,然后用#替换其中每个剩余的非C字符序列。