1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
@motives = ("GAAG","PO","OHO"); # kann man in so ne liste auch ausdrücke wie G[A-Z]{2}G integrieren? open (HANDLE, "< nTM.txt"); $sequence = ''; $sequence2 = ''; while(<HANDLE>) { $line = $_; chomp ($line); $line2 = $_; chomp ($line2); if ($line ne '' && $line2 ne '') { $sequence = $sequence . $line; $sequence2 = $sequence2 . $line2; # weiß nich,ob das alles benötigt wird... foreach $motive(@motives) { foreach $motive2(@motives) { if ($sequence =~ $motive && $sequence2 =~ $motive2 && $motive ne $motive2) # am besten wäre es,wenn auch Paare gleicher Muster gefunden werden, wenn sie sich auf unterschiedlihen Positionen befinden { print "$motive matcht $motive2 \n"; #hier fehlt die Angabe der Zeilen, in der die Muster gefunden werden print "\n"; #leider wird alles mehrfach gezählt... } }} } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
#!/usr/bin/perl use strict; use warnings; my @motives = ( qr(GACG), qr(G[A-Z]{2}G), qr(GAGG?A), qr(Kikeriki)i ); my %gefunden; my $zeilennr; while (my $line = <DATA>) { $zeilennr++; for my $re (@motives) { push @{$gefunden{$re}},$zeilennr if $line =~ $re; } } while (my ($k,$v) = each %gefunden) { print "$k: ", join(",",@$v),"\n"; } #ergibt: #(?-xism:GAGG?A): 1 #(?-xism:GACG): 2 #(?-xism:G[A-Z]{2}G): 1,2 #(?i-xsm:Kikeriki): 4 __DATA__ GAGGA GACG Kuh KikEriKi
2012-04-18T11:51:27 BionerdEs gibt gute Perl-Bücher, auch kostenlose oder gebrauchte, und Online-Tutorials. ;)ich versteh jetzt nicht alles, hab erst seit paar Wochen die Vorlesung zu Perl, aber okay.
2012-04-18T12:12:59 BionerdDann frage doch mal bei uns nach, ob dir jemand umsonst oder gegen Spende das Programm schreibt.Problem ist halt bloß,dass das Programm bis morgen fertig sein sollte
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
open (HANDLE, "< nTM.txt"); while(<HANDLE>) { my @motives = ( qr(G[A-Z]{2}G), qr(O[A-Z]{1}O), qr(P[A-Z]{2}G) ); my %gefunden; my $zeilennr; while (my $line = <HANDLE>) { $zeilennr++; for my $re (@motives) { push @{$gefunden{$re}},$zeilennr if $line =~ $re; } } while (my ($k,$v) = each %gefunden) { print "$k: ", join(",",@$v),"\n"; } } Jetzt wollte ich das <HANDLE> zur Probe einbauen, aber ich mach mit dem Einlesen der Zeilen wohl einen Fehler...Die Zeilennummer ist stets 1.
1 2 3 4
# ein wenig pseudocode dabei open (HANDLE, ">> regulärerAusdruck1_regulärerAusdruck2.txt"); # EDIT: print HANDLE "AusprägungMuster1+AusprägungMuster2 + found in Line %u and Line %u +Name des Files,in dem es gefunden wurde\n"; close (HANDLE);
2012-04-18T14:51:32 BionerdWerden nun auch Musterpaarungen gefunden wie Muster 1 und Muster 1, wenn sie sich in unterschiedlichen Bereichen befinden? Das wäre nämlich auch wichtig.
2012-04-18T14:51:32 BionerdZweitens: Wie könnte man es realisieren, dass das Auftreten von Musterpaarungen in einem Array etc. hochgezählt wird? Ich würde denken, man nimmt die Position der Muster im my @motives, also sagen wir i für Muster 1 und j für Muster x. Dann zählt man im Array @anzahl die entsprechende Zelle +1. Ist das realisierbar? Die spätere Übergabe an eine .csv-Datei dürfte ja unkompliziert sein...
EDIT:Geschehen soll dies einmal für das gesamte Verzeichnis!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
# zeile 7: # Liste aller Kombinationen über alle Dateien my %anzahl; #... #zeile 21: # alle Gefunden Kombinationen durch gehen # dann die Suchbegriffe mit "-!-" zusammenfügen # und dazu einen Zähler erhöhen # "sort" verhindert unnötige Dubletten $anzahl{join('-!-', sort @$_[0,1] )}++ for(@found); #... # zeile 25: # Zusammenfassung: printf ("%s + %s %u\n",split(/-!-/,$_),$all_match{$_}) for(sort keys(%anzahl));
2012-04-18T14:51:32 BionerdDabei fällt mir ein...die Ausgabe der Paarungen+Zeile gefällt mir sehr.
Es sollte doch möglich sein, die einzelnen Ausprägungen der Muster in einem speziellen .txt abzuspeichern,oder? Sprich, alle gefundenen Muster 1_Muster X - Paarungen in ein File, so dass man letztendlich bei 50 Mustern 2500 .txt- Files hat.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# zeile 7: # Ausgabepfad # sollte ein gesondertes Verzeichnis ein. my $out_dir='path/to/dir'; # Ersatz für Zeile 22: # alle Funde durchgehen, # passende Datei öffen # und Zeile hinzufügen. for my $e (@found) { my ($motive1,$motive2)= sort @$e[0,1]; my $outpath="$out_dir/$motive1_$motive2.txt"; if(open(my $fh, '>>', $outpath)) { printf $fh ("%s + %s found in Line %u and Line %u + %s\n", @$e,$file); } else { warn("Error open $outpath ($!)"); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
if($motive1 eq $motive2) { my @list=@{$match{$motive1}}; for my $pos1 (0 .. $#list-1) { for my $pos2 ($pos1+1 .. $#list) { push(@found,[$motive1,$motive1,$list[$pos1],$list[$pos2]]); } } } else { for my $line1 (@{$match{$motive1}) { for my $line2 (@{$match{$motive2}}) { push(@found,[$motive1,$motive2,$line1,$line2]); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
if($motive1 eq $motive2) { my @list=@{$match{$motive1}}; for my $pos1 (0 .. $#list-1) { for my $pos2 ($pos1+1 .. $#list) { push(@found,[$motive1,$motive1,$list[$pos1],$list[$pos2]]); } } } else { for my $line1 (@{$match{$motive1}) { for my $line2 (@{$match{$motive2}}) { push(@found,[$motive1,$motive2,$line1,$line2]); } }
2012-04-19T05:53:06 BionerdDas Programm ist wirklich super und ich hoffe,dass ich es im Verlauf des Tages abschließen kann. Ein grundsätzliches Missverständnis, wofür ich mich entschuldige, ich hätte mich klarer ausdrücken sollen...Das Programm sucht nach G[A-Z]{2}G, das ist gewollt, jedoch hätte ich für die Ausgabe liebend gern die Ausprägung also den darauf passenden String im File z. Bsp. GAAG *lieb guck*....UND: Kann man auch schauen, ob zwei Muster auf der selben Zeile vorkommen???
2012-04-19T05:53:06 Bionerd20: my %all_match;
Habe ich schon ergänzt,da package gefordert wurde.
28: my $outpath="$out_dir/$motive1$motive2.txt"; #meckert sonst
Ansonsten hakt nur noch das Hochzählen....
Use of uninitialized value in printf at Prog.pl line 35 ist die "Fehler"meldung.
2012-04-19T05:53:06 Bionerddie alternative für den Code von Zeile 72-83 konnte ich nicht einfügen, es kamen Fehlermeldungen über Fehlermeldungen.
1 2 3
open (HANDLE, "> ausgabe.csv"); print HANDLE ($anzahl{$_}) for (sort keys(%anzahl)) ; close (HANDLE);