Meine Daten sehen folgendermaßen aus:
G1 G2 G3 G4
Pf1 NO B1 NO D1
Pf2 NO NO C1 D1
Pf3 A1 B1 NO D1
Pf4 A1 NO C1 D2
Pf5 A3 B2 C2 D3
Pf6 NO B3 NO D3
Mein Zweck ist es, in jeder Spalte zu prüfen, ob einElement (abweichend von den "NO" -Fällen) wird zweimal angezeigt (wie A1 in Spalte 2) und nur zweimal (wenn es dreimal oder mehr angezeigt wird, möchte ich es nicht in der Ausgabe) Schreiben Sie die entsprechenden Elemente der ersten Spalte, und die gewünschte Ausgabe sieht folgendermaßen aus:
Pf3 Pf4 A1
Pf1 Pf3 B1
Pf2 Pf4 C1
Pf5 Pf6 D3
Ich versuche, ein Perl-Skript zu schreiben, aber ich brauche Hilfe, um mich auf die verschiedenen Schritte zu konzentrieren. Das habe ich bisher getan:
open (HAN, "< $file_in") || die "Impossible open the in_file";
@r = <HAN>;
close (HAN);
for ($i=0; $i<=$#r; $i++){
chomp ($r[$i]);
($Ids, @v) = split (/t/, $r[$i]);
}
}
Aber ich kann in keine Richtung weitermachen! (Mein Perl-Wissen muss von Ihnen gepusht werden!)
Die heißen Punkte in meinem Kopf sind:
Wie vergleiche ich Elemente aus derselben Spalte (oder überhaupt in derselben Datei)?
Wie kann ich die Elemente der ersten Spalte mit den anderen Spalten verknüpfen (möglicherweise Schlüssel)?
Jede Hilfe ist absolut notwendig und willkommen!
Antworten:
1 für die Antwort № 1use Data::Dumper;
my %hash;
while (<DATA>) {
next if $.==1;
chomp;
my ($first,@others) = (split /s+/);
for (@others){
$hash{$_}.=" ".$first;
}
}
print Dumper %hash;
__DATA__
G1 G2 G3 G4
Pf1 NO B1 NO D1
Pf2 NO NO C1 D1
Pf3 A1 B1 NO D1
Pf4 A1 NO C1 D2
Pf5 A3 B2 C2 D3
Pf6 NO B3 NO D3
Was verwende ich hier? (Tricks)
while (<DATA>){BLOCK}
- Daten aus bestimmten DATA-Abschnitten in der Perl-Skriptdatei lesen. (Ja, Sie können hier Testdaten eingeben, wenn Sie möchten. Aber speichern Sie nicht alles! Dies ist kein Behälter!)
next if $.==1
- $.
- spezielle Variable, die eine Zeilennummer von Eingangsdaten speichert. wie "index".
chomp;
- zurück zu while(<DATA>)
. Einige Variablen in Perl sind verborgen. In Funktionen - @_
Array von Eingabeparametern. Und immer gerne Perl-Programmierer verwenden $_
- You
Variable.
Und das while(<DATA>)
wirklich ein verstecktes while(defined($_ = <DATA>))
.
Funktion chomp
benutzen hidden-You
Variable und versuchen Sie, n Symbol am Ende zu hacken.
Funktion split /REGEX/
auch als Standardvariable übernehmen hidden-You
variabel ($_
).
1 für die Antwort № 2
Perl Multi Liner :),
perl -anE "
/^S/ or next;
$k = shift @F;
push @{$t{$_}}, $k for@F;
}{
@$_-1==2 and say join" ",@$_ for map [@{$t{$_}},$_], sort keys%t;
" file