meine erste Datei haben einige Schlüssel. Beispielperl entfernen Sie identische ID und ähnliche ID, pflegen Sie die Array-Reihenfolge und drucken Sie sie wie Matrix
Eur1
Eur2
Eur3
Eur4
Eur5
Die andere Datei ist die tatsächliche Eingabe. getrennt durch ":" (Header auf der linken Seite ist rechtse Seite ist "|" begrenzt passende IDs.) es aussehen wird,
Eur2_1116: Eur1_9816|Eur1_916|Eur3_16|Eur4_17|Eur5_716
Eur3_2980: Eur1_8568|Eur2_98|Eur2_92|Eur4_12.3|Eur4_12.1|Eur4_12.9
Eur4_786: Eur2_0909|Eur5_1090|Eur5_2535|Eur1_233
Eur1_10616:
Eur5_5634: Eur3_1868|Eur4_8634|Eur1_35923
Eur1_34312:
Eur3_0000: Eur5_8235
Eur3_3433:
Eur5_3354: Eur2_245|Eur2_245|Eur1_34
Eur3_1122: Eur4_4431
in meiner Definition,
identischer IDs identisch ist. Beispiel (Eur2_245, Eur2_245 in Zeile 9)
ähnliche IDs werden von demselben Schlüssel mit unterschiedlichem Wert abgeleitet. Beispiel (Eur1_9816 und Eur1_916 in Zeile 1) oder (Eur4_12.3, Eur4_12.1 und Eur4_12.9 in Zeile 2).
Ich möchte die identischen IDs entfernen. Auch die ähnlichen IDs nach dem ersten Match. Beispiel, Eur1_9816 sollte die Ausgabezeile 2. oder Eur4_12.3 für Zeile 2 gehen. Weil sie die erste ähnliche ID unter anderen ähnlichen IDs sind.
meine gewünschte Ausgabe sollte wie Matrix sein, die Header in der ersten Spalte genau wie die Eingabe-Header. Gefolgt von den geordneten Schlüsseln in den aufeinanderfolgenden Spalten. Zu beachten ist, dass Header auch zu einem der geordneten Schlüssel gehören. So wird der Header selbst zu einer passenden ID in einer entsprechenden Spalte.
Beispiel, Zeile 1, Eur2_1116 ist die Kopfzeile. Es wird in der Zeile 1 als Header und ALSO wird es Teil der "Eur2" geordneten Schlüsselspalte sein.
Und in ähnlicher Weise sollten alle anderen entsprechenden Übereinstimmungen (nach dem Ausschließen identischer, ähnlicher Übereinstimmungen) zu den entsprechenden Spalten gehen.
gewünschter Ausgang # 1
Column1 Eur1 Eur2 Eur3 Eur4 Eur5
Eur2_1116 Eur1_9816 Eur2_1116 Eur3_16 Eur4_17 Eur5_716
Eur3_2980 Eur1_8568 Eur2_98 Eur3_2980 Eur4_12.3
Eur4_786 Eur1_233 Eur2_0909 Eur4_786 Eur5_1090
Eur1_10616 Eur1_10616
Eur5_5634 Eur1_35923 Eur3_1868 Eur4_8634 Eur5_5634
Eur1_34312 Eur1_34312
Eur3_0000 Eur3_0000 Eur5_8235
Eur3_3433 Eur3_3433
Eur5_3354 Eur1_34 Eur2_245 Eur5_3354
Eur3_1122 Eur3_1122 Eur4_4431
mein eigentlicher Code ist, (nach = für Kommentarzeilen, dieser Codeblock ist falsch). Könntest du es bitte korrigieren? Wenn möglich, um die identischen und ähnlichen Übereinstimmungen zu verfolgen, kann ich es in eine separate Datei schreiben?
use strict;
use warnings 'all';
my $ipArr = $ARGV[0]; chomp $ipArr; #setArr.txt
open (IN,"$ipArr") or die "Unalbe to open the file:$!\n";
my $orderArr = $ARGV[1]; chomp $orderArr; #orderArr.txt
open(OA,"$orderArr") or die "Unable to open the order array:$!\n";
my @orderKeys = <OA>; chomp @orderKeys; close OA;
while (my $line = <IN>)
{
chomp ($line);
my ($header,$matchSet) = "";
my (@tmpSet, @setArr1, @setArr2) =();
($header,$matchSet) = split("\:",$line);
$matchSet =~ s/\s+//g;
@tmpSet = split (/\|/, $matchSet);
push(@setArr1,$header,@tmpSet);
sub uniq {
my % seen;
grep !$seen{$_}++, @_;
}
@setArr2 = uniq(@setArr1);
print join "\t", @setArr2,"\n";
}
=for
foreach my $g (@setArr2)
{
my ($k,$val) = "";
$g =~ /^(\w.*)\_(\w.*)$/;
$k = $1; $val = $2;
$hash{$k} = {$val};
}
}
foreach $S (@orderKeys)
{
if($setArr[$i] =~ /^$S\_.*$/)
{
print "$S\t";
}
}
}
print "\n";
}
close IN;
hinzufügen 'use strict;' und 'Verwendung Warnungen;' an der Spitze Ihres Skript und führen Sie es erneut aus. Was sagt es dir? – fugu
Ja, tue ich und ich bekomme eine Ausgabe, in der nur die identischen IDs entfernt werden und keine Bestellung wie in der OrderArr.txt. Denn nachdem "= für" kommentiert wurde, iteriert die Schleife nichts als falsch. – perlbeginner
push (@ setArr1, $ header, @ tmpSet); Bitte überprüfen Sie diese Push-Optionen – ssr1012