/ / Verwenden Sie Schlüssel und Paarungselemente Perl - Perl

Verwenden Sie Tasten und Paarungselemente Perl - Perl

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 № 1
use 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