Druckmuster des Zeichens „C“

Druckmuster des Zeichens „C“

Ich möchte das Muster der Cys-Reste aus jeder in file.tsv angegebenen Zeile ausdrucken. file.tsv hat zwei Spalten als sequenceID und Sequence. Aus der zweiten Spalte der Sequenz sollte der erste Buchstabe „C“ als C ausgedruckt werden. Wenn der nächste unmittelbare Rest nicht C ist, sollte der Code C# ausgeben. # sollte für n verschiedene Aminosäurevorkommen nur einmal vorkommen.

Wenn also in der Spalte „C“ ein weiteres Zeichen folgt, möchte ich nach „C“ # drucken. Wenn die Sequenzspalte also den Wert DCFRCGHCC hat, sollte in der dritten Spalte C#C#CC gedruckt werden.

Beispieleingabe:

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

Die Ausgabe sollte drei Spalten umfassen: 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 

Antwort1

Das erste einzeilige/vollständige Skript analysiert und konvertiert das in der Frage beschriebene Dateiformat; das zweite vollständige Skript analysiert und konvertiert ein FASTA-Dateiformat.


#1

Golf-Einzeiler:

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

Erweitertes vollständiges Skript:

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

Erläuterung:

  • Die Eingabedatei wird zeilenweise abgearbeitet;
  • Jede Zeile wird in zwei Zeichenfolgen aufgeteilt, den Teil vor dem Leerzeichen und den Teil nach dem Leerzeichen.
  • Jeder Teilstring, der aus dem Zeichen „C“ besteht, optional gefolgt von einem weiteren Zeichen (optional, um auch ein Zeichen „C“ am Ende des Strings abzufangen), im zweiten String wird ausgewertet, und wenn das auf das „C“ folgende Zeichen ein „C“ ist, wird „C“ an das Ende eines benutzerdefinierten temporären Strings angehängt, andernfalls wird „C#“ an das Ende des benutzerdefinierten temporären Strings angehängt;
  • Die erste, zweite und benutzerdefinierte temporäre Zeichenfolge werden durch Kommas getrennt gedruckt, gefolgt von einem Zeilenumbruch.

Beispielausgabe:

% 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

Erweiterte Vollversion:

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

Erläuterung:

  • Die Eingabedatei wird zeilenweise abgearbeitet;
  • Wenn die aktuelle Zeile mit einem Zeichen beginnt >, wird an die Zeile ein Leerzeichen angehängt. Wenn eine Folgezeile vorhanden ist, die nicht mit einem >Zeichen beginnt, wird das Zeilenumbruchzeichen aus der aktuellen Zeile entfernt. Die aktuelle Zeile wird in eine temporäre Datei gedruckt.
  • Die temporäre Datei wird zeilenweise abgearbeitet;
  • Jede Zeile wird in zwei Zeichenfolgen aufgeteilt, den Teil vor dem letzten Leerzeichen und den Teil nach dem letzten Leerzeichen.
  • Jeder Teilstring, der aus dem Zeichen „C“ besteht, optional gefolgt von einem weiteren Zeichen (optional, um auch ein Zeichen „C“ am Ende des Strings abzufangen), im zweiten String wird ausgewertet, und wenn das auf das „C“ folgende Zeichen ein „C“ ist, wird „C“ an das Ende eines benutzerdefinierten temporären Strings angehängt, andernfalls wird „C#“ an das Ende des benutzerdefinierten temporären Strings angehängt;
  • Die erste, zweite und benutzerdefinierte temporäre Zeichenfolge werden durch Kommas getrennt gedruckt, gefolgt von einem Zeilenumbruch.
  • Die temporäre Datei wird entfernt;

Beispielausgabe:

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

Antwort2

Hier ist eine awkVersion, die für Sie funktionieren könnte

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

Es dupliziert einfach das zweite Feld, entfernt dann jede nicht leere Anfangssequenz von Nicht-C-Zeichen im Duplikat und ersetzt anschließend jede verbleibende Sequenz von Nicht-C-Zeichen darin durch #.

verwandte Informationen