Vraag Drukpatroon van het "C" -teken


Ik wil het patroon van Cys-restanten van elke regel in file.tsv. file.tsv heeft twee kleuren als sequenceID en Sequence. uit de tweede kolomvolgorde moet het eerste teken "C" worden afgedrukt als C, als het volgende directe residu niet C is, dan moet de code C # afdrukken. # zou maar één keer moeten voorkomen voor n aantal verschillende aminozuurincidenten.

Dus in kolom als "C" wordt gevolgd door een ander teken dat ik # na "C" wil afdrukken. dus als de kolom van de reeks de waarde DCFRCGHCC heeft, dan moet deze in de derde kolom C # C # CC afdrukken.

Voorbeeld invoer:

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

De uitvoer moet drie kolommen zijn: sequenceID, Sequence, Cys-patroon

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
2017-10-07 07:56


oorsprong


Je kunt niet van de meesten van ons verwachten dat ze biologen zijn of dat ze soepel omgaan met patronen van Cys, fasta-sequenties enz. Herformuleer de vraag, zodat het kennen van de biologie in die mate geen must is om het te begrijpen. - kos
Hoe je aankomt C#C#C#C#C en C#C#CC#C is niet helemaal duidelijk. Plaats je een # wanneer het volgende personage is niet een C? - Oli♦
Zoals gezegd is deze vraag hier niet geschikt, we zijn een linux-computerenthousiasten en geen biologen (en misschien wel). Hoe je het ook kunt vragen bij Biology stackexchange (er is tegenwoordig een stapel voor alles :)) biology.stackexchange.com - Mark Kirby
Dus in de rij als "C" wordt gevolgd door een ander teken dat ik # na "C" wil afdrukken. dus als lijn DCFRCGHCC is, dan zou het C # C # CC moeten hebben. Hartelijk dank voor het zo snel antwoorden - Trupti
Neem dus de 2e reeks, druk alleen de C's af, scheid ze met een # indien niet onmiddellijk gevolgd door een andere C. Print de uitvoer op dezelfde regel, na de reeds bestaande 2 velden, komma die alle 3 de velden scheidt. Is dat correct? - Arronical


antwoorden:


De eerste one-liner / full script ontleden en converteren het bestandsformaat beschreven in de vraag; het tweede volledige script parseert en converteert een FASTA-bestandsindeling.


# 1

Golfed one-liner:

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

Uitgebreid volledig script:

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

Uitleg:

  • Het invoerbestand wordt regel voor regel verwerkt;
  • Elke lijn is opgesplitst in twee snaren, het deel voor de spatie en het deel achter de spatie;
  • Elke substring gemaakt van een "C" teken optioneel gevolgd door een ander karakter (optioneel om ook een "C" karakter aan het einde van de string te vangen) in de tweede string wordt geëvalueerd, en als het karakter na de "C" een " C "," C "is toegevoegd aan het einde van een aangepaste tijdelijke reeks; anders wordt "C #" toegevoegd aan het einde van de aangepaste tijdelijke reeks;
  • De eerste, tweede en aangepaste tijdelijke reeks worden afgedrukt, door komma's gescheiden, gevolgd door een nieuwe regel;

Voorbeelduitvoer:

% 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

Uitgebreide volledige versie:

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

Uitleg:

  • Het invoerbestand wordt regel voor regel verwerkt;
  • Als de huidige regel begint met een > karakter, een spatie is toegevoegd aan de regel; als een volgende regel bestaat en niet begint met een > karakter, het teken van de nieuwe regel wordt verwijderd van de huidige regel; de huidige regel wordt afgedrukt naar een tijdelijk bestand;
  • Het tijdelijke bestand wordt regel voor regel verwerkt;
  • Elke regel is opgesplitst in twee snaren, het deel vóór de laatste spatie en het gedeelte na de laatste spatie;
  • Elke substring gemaakt van een "C" teken optioneel gevolgd door een ander karakter (optioneel om ook een "C" karakter aan het einde van de string te vangen) in de tweede string wordt geëvalueerd, en als het karakter na de "C" een " C "," C "is toegevoegd aan het einde van een aangepaste tijdelijke reeks; anders wordt "C #" toegevoegd aan het einde van de aangepaste tijdelijke reeks;
  • De eerste, tweede en aangepaste tijdelijke reeks worden afgedrukt, door komma's gescheiden, gevolgd door een nieuwe regel;
  • Het tijdelijke bestand is verwijderd;

Voorbeelduitvoer:

% 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
2017-10-07 08:58



Deze code werkt prima. En heel erg bedankt voor uw gedetailleerde uitleg - Trupti
@Trupti Graag gedaan, hoewel ik niet denk dat het eigenlijk goed is uitgelegd; Ik heb een uitleg van het script toegevoegd, als je nog een keer wilt controleren of het echt precies doet wat je wilt. - kos
maar het liet me ook toe om te begrijpen hoe de while-lus werkte - Trupti
@Trupti Blijkbaar is het echte formaat van uw invoerbestand degene dat momenteel wordt getoond in uw vraag; kan je dat bevestigen? Als dat zo is, zal ik mijn antwoord moeten veranderen. - kos
@kos Ja, sorry daarover. Het Fasta-formaat omvat >seqname en Oli nam, heel begrijpelijk, de > was bedoeld om te citeren. Omdat het OP Fasta-reeksen vermeldt, zou dat het juiste formaat moeten zijn. - terdon♦


Dit is een awk versie die voor u zou kunnen werken

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

Het dupliceert alleen het tweede veld, verwijdert vervolgens elke niet-lege beginreeks van niet-C-tekens in het duplicaat en vervangt vervolgens elke resterende reeks niet-C-tekens daarin met #.


0
2017-10-07 12:31



Dit werkt ook geweldig! Bedankt voor het uitleggen van een andere manier om te werken - Trupti
Dit was slim, maar blijkbaar is het echte formaat van het invoerbestand degene dat momenteel in de vraag wordt getoond, dus blijkbaar is ook dit antwoord ongeldig. - kos
@kos bedankt voor de heads-up - gebalanceerd - steeldriver