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