/ / Użyj klawiszy i parowania elementów Perl - perl

Użyj klawiszy i elementów parujących Perl - perl

Moje dane wyglądają tak:

    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

Moim celem jest sprawdzenie w każdej kolumnie, czyelement (inny niż w przypadku "NIE") jest pokazywany dwukrotnie (na przykład A1 w kolumnie 2, na przykład) i tylko dwa razy (jeśli jest pokazywany trzy razy lub więcej, nie chcę tego na wyjściu), a jeśli tak, napisz korespondujące elementy pierwszej kolumny, więc pożądane wyjście wygląda następująco:

Pf3 Pf4 A1
Pf1 Pf3 B1
Pf2 Pf4 C1
Pf5 Pf6 D3

Próbuję napisać skrypt perla, ale potrzebuję pomocy, aby skupić się na różnych krokach. Oto co zrobiłem do tej pory:

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]);
}
}

Ale nie mogę iść w żadnym kierunku! (Moja wiedza perl musi zostać przez ciebie popchnięta!)

Najważniejsze punkty w mojej głowie to:

  • jak porównać elementy z tej samej kolumny (lub w każdym razie w tym samym pliku)?

  • jak mogę powiązać elementy pierwszej kolumny z innymi kolumnami (może być kluczami)?

Każda pomoc jest absolutnie konieczna i mile widziany!

Odpowiedzi:

1 dla odpowiedzi № 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

Czego tu używam? (wydziwianie)

while (<DATA>){BLOCK} - odczytać dane z określonej sekcji DATA w pliku skryptowym Perla. (Tak, możesz umieścić tutaj dane testowe, jeśli chcesz, ale nie przechowuj wszystkiego, to nie jest bin!)

next if $.==1 - $. - specjalna zmienna przechowująca numer wiersza danych wejściowych. jak "indeks".

chomp; - wrócić do while(<DATA>). Niektóre zmienne w Perlu są ukryte. W funkcjach - @_ tablica parametrów wejściowych. I zawsze programiści Perla lubią używać $_ - You zmienna.

I to while(<DATA>) naprawdę ukryty while(defined($_ = <DATA>)).

Funkcjonować chomp posługiwać się hidden-You zmienna i spróbuj na końcu przyciąć symbol n.

Funkcjonować split /REGEX/ również przyjąć jako domyślną zmienną hidden-You zmienna ($_).


1 dla odpowiedzi nr 2

Wielowarstwówka Perl :),

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