/ / Dopasowywanie wartości w tablicy 2 D - perl, awk, dopasowanie

Dopasowanie wartości w tablicy 2 D - perl, awk, dopasowanie

#!/usr/bin/perl

my $file = $ARGV[0];
my $value = $ARGV[1];

my @grabbed;

open (FILE, $file);

while (<FILE>) {
if (/alignment#  residue#/) {
push @grabbed, $_;
while (<FILE>) {
last if /^$/;
push @grabbed, $_;
}
}
}
close (FILE);


my $line= `awk "  {if($2==$value)} " @grabbed`;

print $line;

Problem:

1. Po pierwsze, nie wiem, czy możliwe jest wykonanie awk na tablicy, czy nie? 2. Próbuję dopasować wartość istniejącą w drugiej kolumnie tablicy 2-D (@grabbed). @Grabbed będzie wyglądać tak:

     7         1         M     1.000         6                .VPMLG     66.63
8         2         S     1.000        10            .QINTSARKG     66.63
9         3         V     1.000        13         .KTAVFPRGQMSL     66.63
10         4         L     1.000         7               .SLAKFT     66.63
11         5         L     1.000        14        .ALSVQWIKMRYPF     66.63
12         6         R     1.000        16      .DERSAVGTNQLYMIP     66.63
13         7         S     1.000        18    .GDTHPKRSALFCIQVYN     66.63
14         8         G     1.000        17     .DRFLENGAQPSTYCHM     66.63
15         9         L     1.000        19   .NDHPELASVKRCWFGTQI     66.63
16        10         G     1.000        18    .RLDPEGFTYAVCIKNMH     66.63

Próbuję dopasować i pobrać linię, w której kolumna 2 ma wartość „9”.

Odpowiedzi:

4 dla odpowiedzi № 1

Nie trzeba się do niego przekonywać awk kiedy można wykonać tę pracę perl także.

for ( @grabbed ) {
my @f = split;
if ( $f[1] == $value ) {
push @line, $_;
}
}

3 dla odpowiedzi № 2

Wydaje się, że przez „2D Array” masz na myśli tablicę ciągów, z których każdy jest rozdzieloną białymi listami wartości.

Perl jest stworzony do tego rodzaju rzeczy. Możesz użyć innej sugestii odpowiedzi, aby podzielić każdą linię i spojrzeć na każdą wartość; jednak proste wyrażenie regularne byłoby szybsze.

foreach (@grabbed)
{
#Match the beginning of the line, possibly some whitespace,
#then some digits, then more whitespace, then the contents of $value
if (/^s*d+s+$value/)
{
#The line matched: do stuff
}
}

Czy kiedykolwiek będziesz musiał przyjrzeć się wierszom, które nie pasują? Jeśli nie, znacznie bardziej efektywnie byłoby nie umieszczać całego pliku w tablicy, zamiast tego po prostu wykonaj wszystkie operacje w while pętla.